Этот вопрос кажется мне любопытным и интересным. Итак, я пытаюсь понять, что такое лямбда-исчисление, найти ответ и хочу показать его ОП (на самом деле все подсказки уже были показаны, спойлер).
Во-первых, давайте попробуем переопределить f
:
λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2)))
f ::
(Integer -> Integer) -> Integer -> Integer -> Integer -> Integer
Итак, у нас есть функция, которая получает функцию и 3 числа и возвращает ответ. Используя curring, мы можем добавить определение g
прямо здесь, например f_new = f g
:
λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)
f :: Integer -> Integer -> Integer -> Integer
Были сделаны. Давайте проверим это:
λ> f 0 0 0
-13
Ответ правильный.
UPD:
В этих примерах let
— это просто способ объявить функцию в интерпретаторе, поэтому окончательный ответ:
f :: Num a => a -> a -> a -> a
f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)
person
ДМИТРИЙ МАЛИКОВ
schedule
20.11.2011
f = flip flip ((1 +) . ap ((+) . (2 *) . (^ 2)) (10 *)) . (flip .) . ap ((.) . (.) . (.) . (-) . (^ 3)) (((ap id .) .) . flip flip (flip id . (^ 2)) . (liftM2 (liftM2 (+)) .) . (. ((ap id .) . (. flip id) . (.) . (-))) . (.) . (.) . (+))
: f сделал бессмысленным лямбдабот - person fuz   schedule 19.11.2011