区分类型的联合

问题描述

有没有一种方法可以模仿Haskell中TypeScript的区分类型联合?我要执行以下操作:

data A = B | C | D
data W = X | Y | Z

data FinalType = A | W

我知道最后一个定义将为A创建两个值构造函数WFinalType。我现在可以通过以下方式正确制作FinalType

data FinalType = B | C | D | X | Y | Z

但这不是很整洁,并且在添加了许多值构造函数后变得很烦人。在Haskell中有什么方法可以减轻这种情况?

解决方法

如罗宾·齐格蒙德(Robin Zigmond)所建议的,

data FinalType = A A | W W

将起作用。这具有A BA CW Z之类的值。除非您在这里不需要懒惰(相对不太可能),否则您应该使构造函数严格:

data FinalType = A !A | W !W

这样,可以保证计算类型FinalType的值来计算其实际内容。

请注意,与Typescript的并集类型不同,Haskell的总和类型始终是可区分的。这就是AW构造函数在这里扮演的角色,而不是拥有一个公共字段来指示正在使用哪种类型。 AW名称的重载可能会使初学者感到困惑;您可以通过定义来更明确

data FinalType = FinalA A | FinalW W