区分类型的联合

问题描述

有没有一种方法可以模仿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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...