为什么curried匿名函数会将Haskell的类型推断从Num更改为Integer?

时间:2014-06-29 23:02:33

标签: haskell ghc type-inference currying

我正在浏览A brief introduction to Haskell并已来到section on currying。 (所以,请更正我在术语中所犯的任何错误。)

本节说:

  

这是以我们通常的方式定义的双参数函数。    Prelude> let myadd x y = x + y Prelude> myadd 3 4 7

然后再进一步说明:

  

这是定义myadd的第三种等效方法,作为返回另一个匿名函数的匿名函数。    Prelude> let myadd = \x -> \y -> x + y Prelude> :t myadd myadd :: Integer -> Integer -> Integer

即使它说“等效”,但令人惊讶的是(对于像我这样的初学者)并非如此,因为myadd的类型更为通用:

Prelude> :t myadd
myadd :: Num a => a -> a -> a
Prelude> myadd 1.5 2.5
4.0
Prelude> myadd3 1.5 2.5

<interactive>:12:8:
    No instance for (Fractional Integer) arising from the literal `1.5'
    Possible fix: add an instance declaration for (Fractional Integer)
    In the first argument of `myadd3', namely `1.5'
    In the expression: myadd3 1.5 2.5
    In an equation for `it': it = myadd3 1.5 2.5

0 个答案:

没有答案