Haskell表达式数据类型

时间:2019-02-27 18:31:00

标签: haskell types

我想在Haskell中使用以下数据类型:

data Exp = Add Exp Exp
     | Var String 
     | Let (Var String) Exp Exp
     | Int Int 

但是,不允许这样使用(Var String)。我可以使用Exp代替(Var String),但是我不希望在其中使用Int,那么如何解决这个问题?

1 个答案:

答案 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类型的值与AddLetInt的类型。