Этот вопрос кажется мне любопытным и интересным. Итак, я пытаюсь выяснить, что такое лямбда-исчисление, найти ответ и хочу показать его OP (все подсказки уже были показаны на самом деле, spoiler alert ).
Во-первых, давайте попробуем переопределить 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)