Повторное использование лямбда-функции в Haskell

Я должен взять этот код:

f x y z = x^3 - g (x + g (y - g z) + g (z^2))
 where g x = 2*x^2 + 10*x + 1

и перепишите его без where (или let).

они хотят написать его с помощью лямбда-функции (x ->...)

Я пытаюсь повторно использовать лямбда-функцию на Haskell. Есть идеи?

6 ответов


как подсказывает bravit, вы можете переписать нерекурсивный let используя лямбду следующим образом:

let x = A in B     ==>     (\x -> B) A 

здесь x является переменной и A и B выражения.


чтобы повторно использовать что-то, вы можете сделать это аргументом для чего-то.


Я думаю, что намерение-это то, на что намекает bravit.
Smartypants следовать буквам закона обходной путь является обязательным g с case ;)


чтобы расширить подсказки хаммара и бравита, ваше решение потребует не только одной лямбды, но и двух - один из которых будет выглядеть очень похоже на g, а другой из которых будет очень похож на вторую половину f


С помощью лямбда-исчисления g is (\x -> 2*x^2 + 10*x + 1)

поэтому вам нужно заменить g на это в f x y z = x^3 - g (x + g (y - g z) + g (z^2))

$> echo "f x y z = x^3 - g (x + g (y - g z) + g (z^2))" | sed -r -e 's/g/(\x -> 2*x^2 + 10*x + 1)/g'
f x y z = x^3 - (\x -> 2*x^2 + 10*x + 1) (x + (\x -> 2*x^2 + 10*x + 1) (y - (\x -> 2*x^2 + 10*x + 1) z) + (\x -> 2*x^2 + 10*x + 1) (z^2))

Я просто шучу, к сожалению.


этот вопрос кажется любопытным и интересным для меня. Итак, я пытаюсь выяснить, что такое лямбда-исчисление, найти ответ и хочу показать его OP (все подсказки уже были показаны на самом деле,спойлер).

во-первых, давайте попробуем переопределить 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)