问题描述
有没有一种方法可以模仿Haskell中TypeScript的区分类型联合?我要执行以下操作:
data A = B | C | D
data W = X | Y | Z
data FinalType = A | W
我知道最后一个定义将为A
创建两个值构造函数W
和FinalType
。我现在可以通过以下方式正确制作FinalType
:
data FinalType = B | C | D | X | Y | Z
但这不是很整洁,并且在添加了许多值构造函数后变得很烦人。在Haskell中有什么方法可以减轻这种情况?
解决方法
如罗宾·齐格蒙德(Robin Zigmond)所建议的,
data FinalType = A A | W W
将起作用。这具有A B
,A C
和W Z
之类的值。除非您在这里不需要懒惰(相对不太可能),否则您应该使构造函数严格:
data FinalType = A !A | W !W
这样,可以保证计算类型FinalType
的值来计算其实际内容。
请注意,与Typescript的并集类型不同,Haskell的总和类型始终是可区分的。这就是A
和W
构造函数在这里扮演的角色,而不是拥有一个公共字段来指示正在使用哪种类型。 A
和W
名称的重载可能会使初学者感到困惑;您可以通过定义来更明确
data FinalType = FinalA A | FinalW W