歧视型工会
Discriminated type unions
有没有办法在 Haskell 中模仿 TypeScript 的区分类型联合?我想执行以下操作:
data A = B | C | D
data W = X | Y | Z
data FinalType = A | W
我知道最后一个定义将为 FinalType
创建两个值构造函数 A
和 W
。我现在可以通过以下方式正确地制作 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
有没有办法在 Haskell 中模仿 TypeScript 的区分类型联合?我想执行以下操作:
data A = B | C | D
data W = X | Y | Z
data FinalType = A | W
我知道最后一个定义将为 FinalType
创建两个值构造函数 A
和 W
。我现在可以通过以下方式正确地制作 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