在 Haskell 中,提升类型产品意味着 (a,b,c) 和 (a, (b, c)) 之间存在语义差异。
如果所有产品的所有模式匹配总是无可辩驳的,那么就没有区别,并且 (a, b, c) 可以是 (a, (b, c)) 的语法糖。
Haskell 为什么选择升降式产品?
在 Haskell 中,提升类型产品意味着 (a,b,c) 和 (a, (b, c)) 之间存在语义差异。
如果所有产品的所有模式匹配总是无可辩驳的,那么就没有区别,并且 (a, b, c) 可以是 (a, (b, c)) 的语法糖。
Haskell 为什么选择升降式产品?
Haskell 为什么选择升降式产品?
您可以证明这种设计选择的合理性,而无需诉诸懒惰或可反驳的模式。出于支持多态性的原因,ML 做出了相同的设计选择。考虑
fst (x, y) = x
snd (x, y) = y
现在 if(a, (b, c))
是 的语法糖(a, b, c)
,很难看出如何专门化fst
并将snd
这种类型作为参数。但
fst :: (a, (b, c)) -> a
snd :: (a, (b, c)) -> (b, c)
是完全合理的。因为多态函数喜欢fst
和snd
非常有用,Haskell 和 ML 都让程序员能够区分(a, (b, c))
和((a, b), c)
从(a, b, c)
.
(对于关心成本的人来说,类型结构也是一个合理的指导类型的大小和获取其元素所需的间接(加载)次数。一些程序员需要或想知道这些事情并拥有一些对它们的控制程度很小。)
一个原因是实现seq
未提升的产品需要并行/交错计算,因为当且仅当至少一个和是非底部时才seq (a, b) True
应该这样做。你可能不会觉得这个理由非常有说服力,这取决于你对.True
a
b
seq
seq
如果您想与类型类连接,您可以产生语义差异。
(a, b, c)
并且(a, (b, c))
可以以不同的方式实例化类。想想
show (1, 2, 3)
和
show (1, (2, 3))
我认为让两者产生相同的输出是违反直觉的。