我有以下价值:
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
?
答案 0 :(得分:10)
1..4是整数,5是Sum Integer的类型
不完全是。 [1, 2, 3, 4, 5]
的类型为Num t => [t]
,其中类型t
是Num
的实例,等待推断为刚性类型。
当您指出其中一个元素为Sum Integer
时,编译器会将列表中的所有其他元素推断为相同类型。
因此,列表变为[1,2,3,4,5 :: Sum Integer] :: [Sum Integer]
类型,就像您在输出中看到的那样。