在完成“从第一原则开始的Haskell编程”时,我对以下问题的答案感到困惑:
如果
kessel
的类型是(Ord a, Num b) => a -> b -> a
,那么类型为kessel 1 2
是a)
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
无关!
我不明白什么?
感谢您的帮助。
答案 0 :(得分:5)
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
的具体类型,因此限制是没必要。
答案 1 :(得分:1)
kessel 'd' 2
有效且类型为
Char
- 与Num
无关!
是的! kessel 1 2
和kessel 'd' 2
有不同的类型,
λ> kessel = undefined :: (Ord a, Num b) => a -> b -> a
kessel :: (Num b, Ord a) => a -> b -> a
λ> :t kessel 1 2
kessel 1 2 :: (Num a, Ord a) => a
λ> :t kessel 'd' 2
kessel 'd' 2 :: Char
这是可能的,因为kessel
是多态的。