未提升型产品的缺点?
在Haskell中,提升类型产品意味着(a,b,c)和(a,(b,c))之间存在语义差异。
如果所有产品的所有模式匹配总是无可辩驳的,那么就没有区别,并且(a,b,c)可能是(a,(b,c))的语法糖。
为什么Haskell选择提升类型产品?
其中一个原因是,对于未提升的产品实施seq
需要并行/交错计算,因为如果且仅当a
和b
中至少有一个是非底时, seq (a, b) True
才会被认为是True
。 根据你对seq
,你可能找不到这个理由,但当然多态seq
被定义为Haskell的一部分。
为什么Haskell选择提升类型产品?
你可以证明这个设计选择没有吸引懒惰或可以反驳的模式。 出于支持多态性的原因,相同的设计选择被制作为ML。 考虑
fst (x, y) = x
snd (x, y) = y
现在,如果(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)
(a, b, c)
。
(对于关心成本的人来说,类型结构也是获取元素所需的类型大小和间接(负载)数量的合理指南,一些程序员需要或想知道这些事情,并有一些对他们的小程度的控制。)
如果您想要与类型类关联,可以产生语义差异。
(a, b, c)
和(a, (b, c))
可以不同地实例化类。 想想吧
show (1, 2, 3)
和
show (1, (2, 3))
我认为这两种方式都会产生相同的输出,这是违反直觉的。
链接地址: http://www.djcxy.com/p/7495.html