首页 > 解决方案 > 有区别的类型联合

问题描述

有没有办法在 Haskell 中模仿 TypeScript 的可区分类型联合?我想做以下事情:

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

data FinalType = A | W

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

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

但这不是很整洁,并且在添加了许多值构造函数后会变得很烦人。有没有办法在 Haskell 中缓解这种情况?

标签: haskellalgebraic-data-typesdiscriminated-union

解决方案


正如罗宾·齐格蒙德建议的那样,

data FinalType = A A | W W

将工作。这采用A B,A C和等值W Z。除非您在这里需要懒惰(相对不太可能),否则您可能应该使构造函数严格:

data FinalType = A !A | W !W

这样,计算一个类型的值就FinalType可以保证计算出它的实际内容。

请注意,与 Typescript 的 union 类型不同,Haskell 的 sum 类型始终是有区别的。这就是AandW构造函数在这里扮演的角色,而不是有一个公共字段来指示正在使用的类型。初学者可能会被AW名称的重载弄糊涂;你可以通过定义更明确

data FinalType = FinalA A | FinalW W

推荐阅读