Haskell表达式数据类型

Nev*_*ind -1 haskell types

我想在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,所以我该如何解决这个问题呢?

Tho*_*son 5

您可以定义一个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