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