Что ж, поскольку вам нужно передать два параметра, мы можем использовать то, что известно как "оператор удивленной совы". В основном это набор параметров. Итак, мы можем использовать:
f = ((.).(.)) (+) (+)
Или мы можем более встроить оператор, например:
f = ((+) .) . (+)
Оператор совы ((.).(.)) f g
в основном является сокращением от \x y -> f (g x y)
Как это работает?
Каноническая форма "оператора удивленной совы":
= ((.) . (.))
------------- (canonical form)
(.) (.) (.)
Итак, теперь мы можем заменить (.)
s соответствующими лямбда-выражениями:
(\f g x -> f (g x)) (.) (.)
Итак, теперь мы можем выполнить некоторые замены:
(\f g x -> f (g x)) (.) (.)
-> (\x -> (.) ((.) x))
-> (\x -> (\q r y -> q (r y)) ((.) x))
-> (\x -> (\r y -> ((.) x) (r y)))
-> (\x r y -> ((.) x) (r y))
-> (\x r y -> ((\s t u -> s (t u)) x) (r y))
-> (\x r y -> (\t u -> x (t u)) (r y))
-> (\x r y -> (\u -> x ((r y) u)))
-> \x r y u -> x ((r y) u))
-> \x r y u -> x (r y u)
Таким образом, в основном это означает, что наш оператор удивленной совы равен:
surprised_owl :: (y -> z) -> (a -> b -> y) -> a -> b -> z
surprised_owl f g x y = f (g x y) -- renamed variables
И если мы теперь специализируем это с предоставленными функциями (два раза (+)
), мы получим:
f = surprised_owl (+) (+)
so:
f x y = (+) ((+) x y)
person
Willem Van Onsem
schedule
14.06.2018