Haskell返回类型混乱

时间:2017-03-03 22:35:51

标签: haskell

在完成“从第一原则开始的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无关!

我不明白什么?

感谢您的帮助。

2 个答案:

答案 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) => aNum就在那里,因为它是1的类型,而不是kessel的类型。

kessel 'd' 2的类型为Char,而不是Ord Char => Char,因为Char已经是实现Ord的具体类型,因此限制是没必要。

答案 1 :(得分:1)

  

kessel 'd' 2

     

有效且类型为Char - 与Num无关!

是的! kessel 1 2kessel '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多态的