Как бы вы (пере) реализовали итерацию в Haskell? - PullRequest
9 голосов
/ 22 сентября 2010
iterate :: (a -> a) -> a -> [a]

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

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

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

(начинающий Хаскель здесь)

Ответы [ 2 ]

23 голосов
/ 22 сентября 2010

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

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

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

13 голосов
/ 22 сентября 2010

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

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

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

...