我参加了一个编译器课程,我决定在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。有没有解决这个问题,是否有更好的词汇来表达这个问题?
答案 0 :(得分:4)
Const 2
是Atom
,但Print
以Expr
为参数。幸运的是,每个Atom
都可以与Expr
构造函数一起构成Atomic
。所以:
main = do
let test5 = Print (Atomic (Const 2))
print test5