haskell - Haskell 表达式数据类型
问题描述
我想在 Haskell 中有以下数据类型:
data Exp = Add Exp Exp
| Var String
| Let (Var String) Exp Exp
| Int Int
但是,不允许这样使用 (Var String)。我可以使用 Exp 而不是(Var String),但我不希望在那里允许使用 Int,那么我该如何解决这个问题?
解决方案
您可以定义一个新类型包装器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还是,或。String
Var
Add
Let
Int
推荐阅读
- horizontal-line - 制作多条水平线,但受到限制且效率不高
- excel - 将活动工作簿中的工作表 1 复制到活动工作簿工作表工作表 2 的单元格中命名的工作簿中的工作表 2
- arrays - 如何将int数组转换为char数组
- html - unity webgl 填充浏览器,但保留纵横比
- typescript - 如何使用 TypeScript API 将 tsconfig.json 编译成配置对象?
- can-bus - 与 CAN 协议相关的问题?我需要使用 CAN 吗?
- graph - 反向范围色标绘图
- mysql - 如何从查询中获取 X 个随机记录
- java - 无法使用 dotenv
- php - 如何在 Laravel 中同时返回 json 响应和存储数据?