在学习“Haskell 编程的第一原理”时,我对以下问题的答案感到困惑:
If the type of
kessel
is(Ord a, Num b) => a -> b -> a
, then the type ofkessel 1 2
isa)
Integer
b)Int
c)a
d)(Num a, Ord a) => a
e)Ord a => a
f)Num a => a
答案是 d) - 但我认为答案应该是 e),因为第一个参数 (a) 的类型签名的唯一要求是它是一个 Ord
。那么为什么不返回呢?
kessel 'd' 2
有效并且类型为Char
- 与Num
无关!
我不明白什么?
感谢您的帮助。
最佳答案
1
的类型是Num a => a
。当您将其作为第一个参数传递给 kessel
时,其类型仅限于 (Num a, Ord a) => a
因为 kessel
需要Ord
作为其第一个参数。由于结果的类型与第一个参数的类型相同,因此您将得到 (Num a, Ord a) => a
作为结果类型。
请注意,这与第二个参数的类型无关。我想第二个论点只是为了让你感到困惑。如果函数是:
kessel :: Ord a => a -> a
那么kessel 1
的类型仍然是(Num a, Ord a) => a
。 Num
之所以存在,是因为它是 1
的类型,而不是因为 kessel
的类型。
kessel 'd' 2
的类型是 Char
,而不是 Ord Char => Char
,因为 Char
已经是实现 Ord
的具体类型,因此没有必要进行限制。
关于Haskell 返回类型混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589622/