想象一种不允许数据类型使用多个值构造函数的语言。而不是写
data Color = White | Black | Blue
我们会有
data White = White
data Black = Black
data Blue = Black
type Color = White :|: Black :|: Blue
where :|:
(这里不是|
为了避免与 sum 类型混淆)是一个内置类型联合运算符。模式匹配将以相同的方式工作
show :: Color -> String
show White = "white"
show Black = "black"
show Blue = "blue"
如您所见,与副产品相比,它产生了扁平结构,因此您不必处理注射。而且,与 sum 类型不同,它允许随机组合类型,从而获得更大的灵活性和粒度:
type ColorsStartingWithB = Black :|: Blue
我相信构造递归数据类型也不是问题
data Nil = Nil
data Cons a = Cons a (List a)
type List a = Cons a :|: Nil
我知道联合类型存在于 TypeScript 和其他语言中,但为什么 Haskell 委员会选择 ADT 而不是它们?