2009-11-09 66 views
2

我遇到了模塊的語法問題。基本上我試圖將我的代碼分成兩個獨立的文件,一個用於創建對象(AST),另一個用於我所有的功能。如何將文件拆分成Haskell中的模塊?


    --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 

這工作得很好,但是當我嘗試將AST數據類型劃分爲一個單獨的文件,


    --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我遇到錯誤信息


    Undefined data constructor "Num" 

我很確定它的j最糟糕的是我的模塊語法有問題,但我現在已經完全停留了幾個小時。我正在與Hugs合作。謝謝

+0

您在使用Word對象Haskell背景!準備燒! – Rayne 2009-11-10 19:30:41

回答

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