我的模块语法有问题.基本上我正在尝试将我的代码分成两个单独的文件,一个用于我正在创建的对象(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
Run Code Online (Sandbox Code Playgroud)
这工作正常,但当我尝试将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
Run Code Online (Sandbox Code Playgroud)
和
--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
Run Code Online (Sandbox Code Playgroud)
加载main.hs我收到错误消息
Undefined data constructor "Num"
Run Code Online (Sandbox Code Playgroud)
我很确定它只是我模块语法的一个问题,但我已经完全陷入了几个小时了.我和Hugs一起工作.谢谢
sth*_*sth 17
模块ASTADT只导出AST数据类型,但不导出其构造函数.如果要从模块用户隐藏数据类型的实现细节,这非常有用.
在您的情况下,您不希望这样,因此要导出构造函数,您可以module ... where在数据类型之后的行中指定它们,例如AST (Num, Ident).要导出数据类型的所有构造函数,您可以使用(..)而不是明确地命名它们:
module ASTADT (AST (..), aSTLeft, aSTRight) where
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |