未提升型产品的缺点?

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

如果所有产品的所有模式匹配总是无可辩驳的,那么就没有区别,并且(a,b,c)可能是(a,(b,c))的语法糖。

为什么Haskell选择提升类型产品?


其中一个原因是,对于未提升的产品实施seq需要并行/交错计算,因为如果且仅当ab中至少有一个是非底时, seq (a, b) True才会被认为是True 。 根据你对seq ,你可能找不到这个理由,但当然多态seq被定义为Haskell的一部分。


为什么Haskell选择提升类型产品?

你可以证明这个设计选择没有吸引懒惰或可以反驳的模式。 出于支持多态性的原因,相同的设计选择被制作为ML。 考虑

fst (x, y) = x
snd (x, y) = y

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

fst :: (a, (b, c)) -> a
snd :: (a, (b, c)) -> (b, c)

是完全合理的。 由于像fstsnd这样的多态函数非常有用,Haskell和ML都赋予程序员从(a, (b, c))区分(a, (b, c))((a, b), c) (a, b, c)

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


如果您想要与类型类关联,可以产生语义差异。

(a, b, c)(a, (b, c))可以不同地实例化类。 想想吧

show (1, 2, 3)

show (1, (2, 3))

我认为这两种方式都会产生相同的输出,这是违反直觉的。

链接地址: http://www.djcxy.com/p/7495.html

上一篇: Disadvantage of unlifted type products?

下一篇: How does GHC implement unsafePerformIO?