我是Haskell的初学者,正在解析和构建AST。我想知道如何定义类似如下的类型:
Value
可以是Identifier
或Literal
。现在,我只有一个带有两个构造函数的Value
类型(分别使用标识符的名称和字符串文字的值):
data Value = Id String
| Lit String
然而,我想创建一个表示AST中赋值的类型,所以我需要像
这样的东西data Assignment = Asgn Value Value
但很明显,我总是希望Assignment
的第一部分永远是Identifier
!所以我想我应该将Identifier
和Literal
分开来更好地区分事物:
data Identifier = Id String
data Literal = Lit String
但我现在如何定义Value
?我有类似的东西:
-- this doesn't actually work...
data Value = (Id String) -- How to make Value be either an Identifier
| (Lit String) -- or a Literal?
我知道我可以做到
data Value = ValueId Identifier
| ValueLit Literal
但是这让我觉得不那么优雅,让我想知道是否有更好的解决方案?
答案 0 :(得分:0)
我首先尝试重构我的类型,以便我能够使用GADT进行重组,但最终更简单的解决方案是提出leftroundabout的建议。我想这不是那个"不优雅"反正。