Haskell: не удается составить функцию с двумя плавающими аргументами

Я пытаюсь составить функцию типа (Floating a) => a -> a -> a с функцией типа (Floating a) => a -> a для получения функции типа (Floating a) => a -> a -> a . У меня есть следующий код:

test1 :: (Floating a) => a -> a -> a
test1 x y = x

test2 :: (Floating a) => a -> a
test2 x = x

testBoth :: (Floating a) => a -> a -> a
testBoth = test2 . test1
--testBoth x y = test2 (test1 x y)

Однако, когда я компилирую его в GHCI, я получаю следующую ошибку:

/path/test.hs:8:11:
    Could not deduce (Floating (a -> a)) from the context (Floating a)
      arising from a use of `test2'
                   at /path/test.hs:8:11-15
    Possible fix:
      add (Floating (a -> a)) to the context of
        the type signature for `testBoth'
      or add an instance declaration for (Floating (a -> a))
    In the first argument of `(.)', namely `test2'
    In the expression: test2 . test1
    In the definition of `testBoth': testBoth = test2 . test1
Failed, modules loaded: none.

Обратите внимание, что закомментированная версия testBoth компилируется. Странно то, что если я удалю ограничения (Floating a) из всех сигнатур типов или изменю test1 , чтобы просто взять x вместо ] x и y , testBoth компилируются.

Я искал StackOverflow, вики-сайты Haskell, Google и т. д. и не нашел ничего об ограничении на композицию функций, относящихся к эта конкретная ситуация. Кто-нибудь знает, почему это происходит?

6
задан Erik Kaplun 2 September 2015 в 15:31
поделиться