2009-11-09 5 views
2

모듈 구문에 문제가 있습니다. 기본적으로 내 코드를 두 개의 개별 파일로 분할하려고합니다. 하나는 객체 (AST)이고 다른 하나는 모든 함수입니다.하스켈에서 파일을 모듈로 분할하는 방법은 무엇입니까?


    --main.hs 
    data AST = Add (AST) (AST)| 
       Sub (AST) (AST)| 
       Mult (AST) (AST)| 
       Ident Char| 
       Num Int 
       deriving Show 

    aSTLeft (Num l ) = (Num l) 
    aSTLeft (Ident l ) = (Ident l) 
    aSTLeft (Add l _ ) = l 
    aSTLeft (Sub l _ ) = l 
    aSTLeft (Mult l _ ) = l 
    aSTRight (Num r ) = (Num r) 
    aSTRight (Ident r ) = (Ident r) 
    aSTRight (Add _ r ) = r 
    aSTRight (Sub _ r ) = r 
    aSTRight (Mult _ r ) = r 

    isNum (Num x) = True 
    isNum (Ident x) = False 
    isNum (Add (x)(y)) = False 
    isNum (Sub (x)(y)) = False 
    isNum (Mult (x)(y)) = False 

    --a lot more functions here 

이 잘 작동하지만, 별도의 파일로


    --ASTADT.hs 
    module ASTADT (AST,aSTLeft,aSTRight) where 
    data AST = Add (AST) (AST)| 
        Sub (AST) (AST)| 
        Mult (AST) (AST)| 
        Ident Char| 
        Num Int 
        deriving Show 

    aSTLeft  (Num l ) = (Num l) 
    aSTLeft  (Ident l ) = (Ident l) 
    aSTLeft  (Add l _ ) = l 
    aSTLeft  (Sub l _ ) = l 
    aSTLeft  (Mult l _ ) = l 
    aSTRight  (Num r ) = (Num r) 
    aSTRight  (Ident r ) = (Ident r) 
    aSTRight  (Add _ r ) = r 
    aSTRight  (Sub _ r ) = r 
    aSTRight  (Mult _ r ) = r 


    --main.hs 
    import ASTADT 
    isNum (Num x) = True 
    isNum (Ident x) = False 
    isNum (Add (x)(y)) = False 
    isNum (Sub (x)(y)) = False 
    isNum (Mult (x)(y)) = False 
    --a lot more functions here 

로드 main.hs 나는 오류 메시지를 AST의 데이터 유형을 분할 할 때


    Undefined data constructor "Num" 

나는 그 j 내 모듈 구문에 문제가 있지만 몇 시간 동안 완전히 갇혀있다. 나는 Hugs와 일하고있다. 감사합니다

+0

처럼 보일 것이다 하스켈과 맥락 화상 준비! – Rayne

답변

17

모듈 ASTADT은 단지 AST 데이터 형식 만 내보내고 생성자는 내 보내지 않습니다. 이는 모듈 사용자의 데이터 유형 구현 세부 사항을 숨기려는 경우에 유용합니다.

당신이 원하지 않는 경우, 데이터 유형 뒤에 module ... where 행에 지정할 수 있습니다 (예 : AST (Num, Ident)). 데이터 유형의 모든 생성자를 내보내는 대신 명시 적으로 모든 이름의 (..)를 사용할 수 있습니다

module ASTADT (AST (..), aSTLeft, aSTRight) where 
... 
4

내보내기 선언을 데이터 생성자를위한 당신의 단어 개체를 사용

module ASTADT (AST (Add, Sub, Mult, Ident, Num), aSTLeft, aSTRight) where 
관련 문제