Как бы вы (re)реализовали iterate в Haskell?

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

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

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

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

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

2 ответов


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

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

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


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

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

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