未提升型产品的缺点?

Pea*_*ker 16 haskell types programming-languages functional-programming lazy-evaluation

在Haskell中,提升型产品意味着(a,b,c)和(a,(b,c))之间存在语义差异.

如果所有产品的所有模式匹配总是无可辩驳的,则没有区别,(a,b,c)可能是(a,(b,c))的语法糖.

为什么Haskell会选择升降式产品?

Nor*_*sey 9

为什么Haskell会选择升降式产品?

您可以证明这种设计选择是合理的,而不会引起懒惰或可反射的模式.出于支持多态性的原因,相同的设计选择是ML.考虑

fst (x, y) = x
snd (x, y) = y
Run Code Online (Sandbox Code Playgroud)

现在,如果(a, (b, c))是语法糖(a, b, c),那么很难看出如何专门化fst并将snd此类型作为参数.但

fst :: (a, (b, c)) -> a
snd :: (a, (b, c)) -> (b, c)
Run Code Online (Sandbox Code Playgroud)

非常合理.因为多态函数喜欢fst并且snd非常有用,所以Haskell和ML都能让程序员能够区分(a, (b, c))((a, b), c)使用(a, b, c).

(对于关心成本的人来说,类型结构也是对类型大小和获取元素所需的间接(负载)数量的合理指导.一些程序员需要或想知道这些事情并拥有一些对他们的控制程度很小.)

  • 你在回答为什么(a,b,c)不与(a,(b,c))同构(或者,更容易使用,(a,(b,(c,()))),但不是为什么型号产品不被提升.提升意味着添加底部,使(未定义,未定义)与未定义不同. (4认同)

Rei*_*ton 6

一个原因是实现seq未提升的产品需要并行/交错计算,因为当且仅当至少一个并且是非底部时才seq (a, b) True应该这样做.根据你的感受,你可能没有找到这个非常令人信服的理由,但当然多态是Haskell的一部分......Trueabseqseq