2017-08-14 28 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]类型,正如您在输出中看到的那样。