16

在Haskell中,提升類型產品意味着(a,b,c)和(a,(b,c))之間存在語義差異。如果所有產品的所有模式匹配總是無可辯駁的,那麼就沒有區別,並且(a,b,c)可能是(a,(b,c))的語法糖。未搬運型產品的缺點?

爲什麼Haskell選擇提舉類型產品?

+1

因爲變平的元組不太有用嗎? – kennytm 2010-03-21 18:44:11

+2

「扁平」你的意思是未升降?如果是這樣,爲什麼?對我來說這似乎並不明顯,而未升級的元組具有更好的正式代數性質。 – 2010-03-21 18:49:28

+1

我寧願它是'(a,(b,(c,()))'的語法糖,就像HList – yairchu 2010-03-22 23:27:13

回答

6

的一個原因是,對於一個未提升產品實施seq需要並行/交織計算,因爲seq (a, b) True將被認爲是True如果和僅a如果至少一個和b是非底部。您可能找不到這種理由,這取決於您對seq的看法,但當然多態性seq根據定義是Haskell的一部分...

+0

我認爲seq應該使用類型類,我認爲在當前的「seq」應該允許形式使分化程序終止,而不是相反。 – Peaker 2010-03-21 19:00:45

+0

Iow,我沒有真正遇到seq(\ _ | \ _,\ _ | \ _)的問題True ==即使元組未被提升也是如此。 – Peaker 2010-03-21 19:04:55

+0

在這一點上,你可能不會讓'(a,b)'成爲'Seq'的一個實例(並且'a - > b'也是如此)。 – 2010-03-21 19:09:29

0

如果您想要與類型相關聯,則可以產生語義差異類。

(a, b, c)(a, (b, c))可以不同地實例化類。試想

show (1, 2, 3) 

show (1, (2, 3)) 

我認爲這是反直覺有兩個產生相同的輸出。

+4

我真的很不喜歡這個。它導致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

8

爲什麼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)的能力。 (對於那些關心成本的人來說,類型結構也是獲取元素類型大小和間接(負載)數量的合理指南,一些程序員需要或想知道這些事情並對它們有一些小程度的控制。)

+3

您正在回答爲什麼(a,b,c)不是同構的(a,(b,c))(或者更容易與(a,(b,(c,()))))一起工作,但不是爲什麼類型產品沒有被提升。提升意味着添加一個底部,使得(未定義的,未定義的)與未定義的不同。 – luqui 2010-03-23 18:00:00

+1

@luqui:同意。我選擇瞭解決問題中關注'(a,(b,c))'和'(a,b,c)'之間語義差異的部分。當這個區別被關注時,解除是明顯的 - 元組被提升,因爲*每個*類型都被解除。 – 2010-03-23 22:41:06