2017-08-14 68 views
-2

我有以下值:它如何變成具體的類型?

Prelude Data.Monoid> [1,2,3,4,5 :: Sum Integer] 
[Sum {getSum = 1},Sum {getSum = 2},Sum {getSum = 3},Sum {getSum = 4},Sum {getSum = 5}] 

正如你所看到的,1..4是整數,5是一類Sum Integer
列表的內容如何變爲Sum Integer類型?裏面還有更多Integers,爲什麼不變成Integer

+1

答案[你剛纔問過的其他問題](https://stackoverflow.com/questions/44802606/how-does-haskell-convert-integer-literals-to-different-types)應該覆蓋這個我想也是。 – Alec

回答

10

1..4是整數,且5是一種類型的薩姆整數

不完全。 [1, 2, 3, 4, 5]類型爲Num t => [t],其中類型tNum等待推斷爲剛性類型的實例。

當您指出其中一個元素是Sum Integer時,編譯器會將列表中的所有其他元素推斷爲相同類型。

因此,該列表變爲[1,2,3,4,5 :: Sum Integer] :: [Sum Integer]類型,正如您在輸出中看到的那樣。