在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選擇提舉類型產品?
的一個原因是,對於一個未提升產品實施seq
需要並行/交織計算,因爲seq (a, b) True
將被認爲是True
如果和僅a
如果至少一個和b
是非底部。您可能找不到這種理由,這取決於您對seq
的看法,但當然多態性seq
根據定義是Haskell的一部分...
如果您想要與類型相關聯,則可以產生語義差異類。
(a, b, c)
和(a, (b, c))
可以不同地實例化類。試想
show (1, 2, 3)
和
show (1, (2, 3))
我認爲這是反直覺有兩個產生相同的輸出。
我真的很不喜歡這個。它導致N元組爆炸(例如:參見ghci中的「:info Show」),並且它不可能僅實例化(a,b)以獲取所有元組的實例。 我真的不想爲(a,b,c)比(a,(b,c))有不同的語義。我希望爲剛剛回來的「(a,b,c)」展示。 此外,N元組的不可聚集性真的很煩人。 我們需要一個bstillion變體的「fst」和「snd」,Control.Arrow.first/second,Data.Accessor的元組訪問器等。 – Peaker 2010-03-21 19:03:35
爲什麼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,()))))一起工作,但不是爲什麼類型產品沒有被提升。提升意味着添加一個底部,使得(未定義的,未定義的)與未定義的不同。 – luqui 2010-03-23 18:00:00
@luqui:同意。我選擇瞭解決問題中關注'(a,(b,c))'和'(a,b,c)'之間語義差異的部分。當這個區別被關注時,解除是明顯的 - 元組被提升,因爲*每個*類型都被解除。 – 2010-03-23 22:41:06
因爲變平的元組不太有用嗎? – kennytm 2010-03-21 18:44:11
「扁平」你的意思是未升降?如果是這樣,爲什麼?對我來說這似乎並不明顯,而未升級的元組具有更好的正式代數性質。 – 2010-03-21 18:49:28
我寧願它是'(a,(b,(c,()))'的語法糖,就像HList – yairchu 2010-03-22 23:27:13