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

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

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

и переписать его без где (или пусть).

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

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

Ответы [ 6 ]

12 голосов
/ 19 ноября 2011

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

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

, где x - переменная, а A и Bэто выражения.

8 голосов
/ 19 ноября 2011

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

2 голосов
/ 19 ноября 2011

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

2 голосов
/ 19 ноября 2011

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

1 голос
/ 19 ноября 2011

Использование лямбда-исчисления g - это (\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))

Я просто шучу, извините.

0 голосов
/ 20 ноября 2011

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