Вопрос

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

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

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

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

(Haskell новичок здесь)

Это было полезно?

Решение

Хорошо, истребитель Создает бесконечный список значений а. увеличивается F.. Отказ Так что я начну с написания функции, которая добавила некоторую ценность а. к списку, построенному рекурсивно вызывающим итерацией с фальсификация:

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top