haskell - 有区别的类型联合
问题描述
有没有办法在 Haskell 中模仿 TypeScript 的可区分类型联合?我想做以下事情:
data A = B | C | D
data W = X | Y | Z
data FinalType = A | W
我知道最后一个定义将创建两个值构造函数A
和W
for FinalType
。我现在可以通过FinalType
以下方式正确地制作:
data FinalType = B | C | D | X | Y | Z
但这不是很整洁,并且在添加了许多值构造函数后会变得很烦人。有没有办法在 Haskell 中缓解这种情况?
解决方案
正如罗宾·齐格蒙德建议的那样,
data FinalType = A A | W W
将工作。这采用A B
,A C
和等值W Z
。除非您在这里需要懒惰(相对不太可能),否则您可能应该使构造函数严格:
data FinalType = A !A | W !W
这样,计算一个类型的值就FinalType
可以保证计算出它的实际内容。
请注意,与 Typescript 的 union 类型不同,Haskell 的 sum 类型始终是有区别的。这就是A
andW
构造函数在这里扮演的角色,而不是有一个公共字段来指示正在使用的类型。初学者可能会被A
和W
名称的重载弄糊涂;你可以通过定义更明确
data FinalType = FinalA A | FinalW W
推荐阅读
- django - 在通用detailview django中使用get_context_data重定向
- vba - 计数日期早于特定日期
- ios - 用图像反应原生 iOS 推送通知
- angular - ngrx 效果中的 switchMap 取消选项 http 请求
- ruby - Redcarpet gem 的新行错误
- node.js - Node.js 应用程序监控服务 - OpBeat 替代方案
- excel - 使用python从非结构化Excel文件中解析数据
- php - 动态地将数组推入多维数组
- python - 如何在 PIL 中围绕中心剪切图像?
- php - Woocommerce单品页面背景如何显示产品图库图片