让我们看看这些约束是如何解释类型的。
数字
在 Haskell 中,文字数字被替换为对 fromInteger 的调用(或 fromRational,如果其中包含小数点或“e”)。这样,一个人可以写 '1' 并将其设置为 float 或 double 或 int 或其他。 fromInteger 的类型是
fromInteger :: Num a => a
所以1 被脱糖为fromInteger (1::Integer),其类型为Num t => t
范围
在 Haskell 中,语法 [a..b] 被转换为调用 enumFromTo a b,类型为 enumFromTo :: Enum a => a -> a -> [a]。把这些放在一起,我们得到
[1..5] == enumFromTo (fromInteger 1) (fromInteger 5) :: (Enum a, Num a) => [a]
把它们放在一起
现在(*) 的类型是Num b => b -> b -> b,所以我们将它们组合在一起得到:
(Num t,
Num a,
Enum a,
Num b,
t~b,
[a]~b) => b
注意a~b 表示a 和b 的类型相同。结合这些给出类型
(Num a, Enum a, Num [a]) => [a]