Идиомы композиции (.) И приложения ($) функции 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 и т. Д. И не нашел ничего об ограничении состава функций, относящегося к данной конкретной ситуации. Кто-нибудь знает, почему это происходит?