Что происходит с типами в этом сеансе ghci?

Я изучаю Haskell и балуюсь с ghci, когда наткнулся на кое-что очень загадочное.

Во-первых, создайте простую функцию добавления:

Prelude> let add x y = x + y

Обратите внимание, что она работает с целыми и плавающими числами:

Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8

Теперь создайте функцию применения. Он идентичен $(но не инфикс). Это работает как no-op при добавлении:

Prelude> let apply f x = f x
Prelude> apply add 3 4
7
Prelude> apply add 2.5 1.3
3.8

Хорошо, теперь сделайте add', что то же самое, что и add', но используя apply:

Prelude> let add' = apply add
Prelude> add' 3 4
7
Prelude> add' 2.5 1.3

<interactive>:1:9:
    No instance for (Fractional Integer)
      arising from the literal `1.3' at <interactive>:1:9-11
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `add'', namely `1.3'
    In the expression: add' 2.5 1.3
    In the definition of `it': it = add' 2.5 1.3

Wat.

Вот типы:

Prelude> :t add
add :: (Num a) => a -> a -> a
Prelude> :t apply add
apply add :: (Num t) => t -> t -> t
Prelude> :t add'
add' :: Integer -> Integer -> Integer
Prelude> 

Почему тип add'отличается от типа apply add?

Является ли это странностью ghci, или это верно для Haskell в целом? (А как отличить?)

21
задан Laurence Gonsalves 12 June 2012 в 19:31
поделиться