Повторное использование лямбда-функции в 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)