Скажем, я определяю эту функцию:
f = ($ 5)
Тогда я могу применить его:
> f (\x -> x ^ 2)
25
Его тип:
:t f
f :: (Integer -> b) -> b
Что имеет смысл, он получает функцию в качестве аргумента и возвращает эту функцию, примененную к Integer
5
.
Теперь я определяю эту функцию:
g = flip f
Я бы ожидал, что это не имеет смысла, потому что f
является функцией одного аргумента.
Но, проверяя его тип:
:t g
g :: b -> (Integer -> b -> c) -> c
Итак, теперь g
является функцией из двух аргументов!
Применяя его к некоторым значениям:
> g [2, 4, 6] (\x y -> x:y)
[5,2,4,6]
Что здесь происходит? Что означает flip ($ 5)
?