我想在Haskell中拥有以下数据类型:
data Exp = Add Exp Exp
| Var String
| Let (Var String) Exp Exp
| Int Int
Run Code Online (Sandbox Code Playgroud)
但是,不允许使用(Var String).我可以使用Exp代替(Var String),但我不希望在那里允许使用Int,所以我该如何解决这个问题呢?
您可以定义一个newtype包装器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
Run Code Online (Sandbox Code Playgroud)
或者只是用字符串:
data Exp = Add Exp Exp
| Var String
| Let String Exp Exp
| Int Int
Run Code Online (Sandbox Code Playgroud)
编辑:我的评论试图提出的观点可能不清楚.在使用Var时,例如Let (Var String) Exp Exp,您尝试在需要类型的位置使用名为Var(及其字段String)的构造函数.每个数据构造函数都可用于构建类型的值(在本例中为Exp),并且不能通过类型系统进一步区分.以代替附加的数据声明不能类型精通的一个值,该值是一个区分从一个是一个,或.VarAddLetInt