Har*_*ang 1 haskell algebraic-data-types discriminated-union
有没有办法在 Haskell 中模仿 TypeScript 的可区分类型联合?我想做以下事情:
data A = B | C | D
data W = X | Y | Z
data FinalType = A | W
Run Code Online (Sandbox Code Playgroud)
我知道最后一个定义将创建两个值构造函数A和Wfor FinalType. 我现在可以通过FinalType以下方式正确制作:
data FinalType = B | C | D | X | Y | Z
Run Code Online (Sandbox Code Playgroud)
但这不是很整洁,并且在添加了大量值构造函数后变得很烦人。有没有办法在 Haskell 中缓解这种情况?
正如罗宾·齐格蒙德所建议的那样,
data FinalType = A A | W W
Run Code Online (Sandbox Code Playgroud)
将工作。这需要对价值一样A B,A C和W Z。除非你在这里需要懒惰(相对不太可能),你应该让构造函数变得严格:
data FinalType = A !A | W !W
Run Code Online (Sandbox Code Playgroud)
这样,计算 type 的值就FinalType可以保证计算出它的实际内容。
请注意,与 Typescript 的联合类型不同,Haskell 的 sum 类型总是被区分的。这就是 theA和W构造函数在这里扮演的角色,而不是有一个公共字段来指示正在使用的类型。初学者可能会因A和W名称的重载而感到困惑;你可以通过定义更明确
data FinalType = FinalA A | FinalW W
Run Code Online (Sandbox Code Playgroud)