我是Haskell的新手,正在研究Haskell LLVM教程.在其中,作者定义了一个简单的代数数据类型来表示AST.
type Name = String
data Expr
= Float Double
| BinOp Op Expr Expr
| Var String
| Call Name [Expr]
| Function Name [Expr] Expr
| Extern Name [Expr]
deriving (Eq, Ord, Show)
data Op
= Plus
| Minus
| Times
| Divide
deriving (Eq, Ord, Show)
Run Code Online (Sandbox Code Playgroud)
但是,这不是一个理想的结构,因为解析器实际上期望Expr一个Externwill 中的列表只包含表示变量的表达式(即在这种情况下的参数不能是任意表达式).我想让类型反映这个约束(使用QuickCheck更容易生成随机有效的AST); 但是,为了解析器函数(所有类型都有Parser Expr)的一致性,我不只是想说| Expr Name [Name].我想做这样的事情:
data Expr
= ...
| Var String
...
| Function Name [Expr] Expr …Run Code Online (Sandbox Code Playgroud)