"beta 缩减时的类型类约束类型变量"用例



我正在学习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 :: a2 :: b.

现在,数字文字(如14214.25(总是Num类型类的一种类型。事实上:

Prelude> :t 1
1 :: Num t => t

目前还不确定是什么类型(因为它可以是IntIntegralFloat等(。但这意味着我们现在进一步约束了a的类型,因此结果也应该具有该类型约束。

如果我们使用Char,那么a将是一个Char

Prelude> :t f 'a' 2
f 'a' 2 :: Char

最新更新