我正在学习Haskell,当我们减少这个表达式时,有一个我不明白的逻辑:
Prelude> let f :: (Ord a, Num b) => a -> b -> a; f = undefined
Prelude> :t f 1 2
f 1 2 :: (Num a, Ord a) => a
我不明白为什么我们会受到 Num 的限制,我本来会期望更多类似的东西:
`f 1 2 :: Ord a => a`
您部分应用了带有f 1 2
f
。所以这意味着1 :: a
,2 :: b
.
现在,数字文字(如1
、42
、14.25
(总是Num
类型类的一种类型。事实上:
Prelude> :t 1
1 :: Num t => t
目前还不确定是什么类型(因为它可以是Int
、Integral
、Float
等(。但这意味着我们现在进一步约束了a
的类型,因此结果也应该具有该类型约束。
如果我们使用Char
,那么a
将是一个Char
:
Prelude> :t f 'a' 2
f 'a' 2 :: Char