Как бы вы (пере) реализовали итерацию в Haskell?

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

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

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

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

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

8 голосов | спросил Andrei Ciobanu 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 22 Sep 2010 17:34:52 +0400 2010, 17:34:52

2 ответа


0

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

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

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

ответил danportin 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 22 Sep 2010 17:42:17 +0400 2010, 17:42:17
0

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

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

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

ответил sclv 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 22 Sep 2010 18:46:44 +0400 2010, 18:46:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132