将类型设置为一种类型或另一种类型

时间:2015-10-17 09:57:15

标签: haskell

我是Haskell的初学者,正在解析和构建AST。我想知道如何定义类似如下的类型:

Value可以是IdentifierLiteral。现在,我只有一个带有两个构造函数的Value类型(分别使用标识符的名称和字符串文字的值):

data Value = Id String
           | Lit String

然而,我想创建一个表示AST中赋值的类型,所以我需要像

这样的东西
data Assignment = Asgn Value Value

但很明显,我总是希望Assignment的第一部分永远是Identifier!所以我想我应该将IdentifierLiteral分开来更好地区分事物:

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

但是这让我觉得不那么优雅,让我想知道是否有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

我首先尝试重构我的类型,以便我能够使用GADT进行重组,但最终更简单的解决方案是提出leftroundabout的建议。我想这不是那个"不优雅"反正。