Haskell没有发现"间接"类型

时间:2017-09-14 23:35:50

标签: haskell abstract-syntax-tree

我参加了一个编译器课程,我决定在haskell中完成它,但是我很难设置编程器。我的问题是我有一个Atom类和一个Expr类,Expr的一个实例可以是Atom,但是当Expr立即生效时一个Atom它有一个问题。这是一个例子:

data Atom -- cannot be reduced farther
    = Const Int -- int is value
    | Var String -- string is name
    deriving (Show) -- So we can print it

data Expr -- add input and the like
    = Add Expr Expr -- add is two exprs
    | USub Expr -- negation
    | Input -- call to input
    | Atomic Atom -- or an atomic
    deriving (Show) -- So we can print it

data Statement
    = Print Expr
    | Discard Expr
    | Assign String Expr
    deriving (Show) -- So we can print it


main = do 
    let test5 = Print (Const 2)
    putStrLn $ show test5

编译器在Print (Const 2)上失败,因为它期望一个Expr。有没有解决这个问题,是否有更好的词汇来表达这个问题?

1 个答案:

答案 0 :(得分:4)

Const 2Atom,但PrintExpr为参数。幸运的是,每个Atom都可以与Expr构造函数一起构成Atomic。所以:

main = do
    let test5 = Print (Atomic (Const 2))
    print test5