Haskell 哈斯凯尔没有找到;间接的;类型

Haskell 哈斯凯尔没有找到;间接的;类型,haskell,abstract-syntax-tree,Haskell,Abstract Syntax Tree,我参加了一个编译器课程,我决定在haskell中学习,但是我很难设置ast。我的问题是我有一个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 ca

我参加了一个编译器课程,我决定在haskell中学习,但是我很难设置ast。我的问题是我有一个
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

编译器在
打印(Const 2)
时失败,因为它需要一个Expr。有没有解决这个问题的方法,有没有更好的词汇来表达这个问题?

const2
是一个
Atom
,但是
Print
使用
Expr
作为参数。幸运的是,每个
Atom
都可以通过
Atomic
构造函数生成
Expr
。因此:

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

Const 2
是一个
Atom
,但
Print
Expr
作为参数。幸运的是,每个
Atom
都可以通过
Atomic
构造函数生成
Expr
。因此:

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

Print(原子(常量2))如何?
?可以方便地定义
IsString Atom
Num Atom
实例(第二个实例仅在
Const
情况下工作)。然后,
Print(Atomic 2)
会起作用,而
Print(Atomic“hi”)
@BenjaminHodgson也会起作用。想问一下,这样我就可以接受它并给你信任了吗?
Print(Atomic(Const 2))
?定义
IsString-Atom
Num-Atom
实例可能很方便(第二个只在
Const
情况下工作)。然后,
Print(Atomic 2)
会起作用,而
Print(Atomic“hi”)
@BenjaminHodgson也会起作用。想问一下,这样我就可以接受它并给你信用?