2010-09-22 7 views
8
iterate :: (a -> a) -> a -> [a] 

(Как вы, вероятно, знаете) iterate - это функция, которая принимает функцию и начальное значение. Затем он применяет функцию к стартовому значению, затем применяет ту же функцию к последнему результату и так далее.Как бы вы (пере) реализовать итерацию в Haskell?

Prelude> take 5 $ iterate (^2) 2 
[2,4,16,256,65536] 
Prelude> 

Результат - бесконечный список. (поэтому я использую take). Мой вопрос: как бы вы реализовали свою собственную функцию iterate' в Haskell, используя только базовые сведения ((:)(++) lambdas, pattern mataching, guard и т. Д.)?

(начинающий Haskell здесь)

ответ

22

Ну, итерация создает бесконечный список значений увеличивается на е. Поэтому я хотел бы начать с написания функции, которая вставляться перед некоторое значение к списку строится рекурсивно вызывая итерация с фа:

iterate :: (a -> a) -> a -> [a] 
iterate f a = a : iterate f (f a) 

Благодаря ленивым вычислениям, только та часть построенного списка необходимых для вычисления значение моей функции будет оценено.

+0

Благодарим Вас за отзыв. –

+0

Это выглядит как вариант определения «fix» fix f = f (fix f) «похожее на ...» итерация f (fa) «вы можете использовать исправление для определения итерации: « итерация fa = fix (\ rx -> x: r (fx)) a "не то, что он лучше, просто думал id сказать :) – QuantumKarl

12

Также обратите внимание, что вы можете найти краткие определения для диапазона основных функций Haskell в отчете Standard Prelude.

Чтение через этот список простых определений, которые, по существу, загружают богатую библиотеку из исходных примитивов, могут быть очень образовательными и открывать глаза с точки зрения предоставления окна на «пути haskell».

Я помню очень ранний момент ага на чтении: data Bool = False | True.

+0

Nice link! Очень воспитательный! –