我想在Haskell中使用以下数据类型:
data Exp = Add Exp Exp
| Var String
| Let (Var String) Exp Exp
| Int Int
但是,不允许这样使用(Var String)。我可以使用Exp代替(Var String),但是我不希望在其中使用Int,那么如何解决这个问题?
答案 0 :(得分:5)
您可以定义新包装器Var
或仅使用String
。首先是newtype包装器示例:
newtype Var = V String
-- ^ "Var" here is a type declaration. "V" is declaring a data constructor.
data Exp = Add Exp Exp
| Var Var -- The first "Var" here is declaring a data constructor. The second is referring to the type.
| Let Var Exp Exp -- "Var" here is referring to the type
| Int Int
或仅使用字符串:
data Exp = Add Exp Exp
| Var String
| Let String Exp Exp
| Int Int
编辑:我的评论试图表达的观点可能不清楚。在使用Var时(例如Let (Var String) Exp Exp
),您尝试在需要 type Var(及其字段,String
)的构造函数。 >。每个数据构造函数都可用于构建类型(在这种情况下为 Exp )的 value ,并且不能由类型系统进一步区分。代替其他数据声明,您无法区分Var
的Exp类型的值与Add
,Let
或Int
的类型。