首页 > 解决方案 > Haskell 表达式数据类型

问题描述

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

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

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

标签: haskelltypes

解决方案


您可以定义一个新类型包装器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,您尝试在需要typeVar的位置使用名为(以及它的字段)的构造函数。每个数据构造函数都可以用于构建类型的(在这种情况下为Exp),并且无法通过类型系统进一步区分。代替附加数据声明,您无法区分 Exp 类型的值是 a还是,或。StringVarAddLetInt


推荐阅读