Eta reduction (Haskell)
От: dr.Chaos Россия Украшения HandMade
Дата: 21.03.07 11:16
Оценка:
Вот решил посмотреть чисто функциональный язык. Выбрал Haskell .

Вот читаю YAHT.

Возникла пара вопросов по сокращению записи функций:

1. Есть пример как выразить ф-ю filter с помощью foldr (7.12)

filter p [] = []
filter p (x:xs) =
if p x
then x : filter p xs
else filter p xs


...
Now, suppose that we call the result of calling filter p xs simply b, then we can rewrite this as:

filter p [] = []
filter p (x:xs) =
if p x then x : b else b

filter p = foldr (\a b -> if p a then a:b else b) []


Вопрос в том, как компилятор(интерпретатор) поймет, что b это filter p xs

2. Чуть ниже приводиться подобный пример для ++

(++) [] ys = ys
(++) (x:xs) ys = x : (xs ++ ys)

Now, the question is whether we can write this in fold notation. First, we can apply eta reduction to the first line to give:

(++) [] = id


Несколько не понял выделенную замену, что она дает и как её понимает компилятор.

Through a sequence of steps, we can also eta-reduce the second line:

(++) (x:xs) ys = x : ((++) xs ys)
==> (++) (x:xs) ys = (x:) ((++) xs ys)
==> (++) (x:xs) ys = ((x:) . (++) xs) ys --Здесь может имелось в виду ((x:) . (++)) xs ys?
==> (++) (x:xs) = (x:) . (++) xs

Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.