Дополнительное образование

что такое корекурсия? прочитал статью в википедии и нечегч не поня

Haskell — достаточно необычный язык. И несмотря на немалое количество статей по нему, нередко можно столкнуться с мнением, что всё это помогает лишь в синтетических примерах. И действительно: на простых примерах всё выглядит просто, но куда сложнее представить себе хотя бы небольшую программу в таком стиле, а статьи зачастую рассматривают лишь особенности языка.
Хаскель является чистым и ленивым функциональным языком; это значит, что результат функции зависит только от аргументов, т. е. будучи вызванной с одним аргументом, функция всегда вернёт один и тот же результат. Поэтому здесь нет переменных — есть функции и значения — однако это никак не мешает. Ленивость означает, что значение будет вычислено только тогда, когда оно действительно понадобится, что позволяет работать с бесконечными списками и структурами данных.
Бесконечные списки.
Бесконечный список можно определить через корекурсию — операцию, подобную рекурсии, но не свёртывающую структуру данных (уменьшение значения аргумента тоже можно назвать свёртыванием) , а «развёртывающую» результат (Total FP) на основе изначальных аргументов:

ghci> let ones = 1 : ones
ghci> take 5 ones
[1,1,1,1,1]

Благодаря ленивости, полученная бесконечная структура данных (в данном случае ones — это список, в голове которого находится 1, а в хвосте — сам ones, т. е. это бесконечный список единиц) не вычисляется без необходимости, и ей можно пользоваться как обычно. Где это может пригодиться на практике? Например, в строгих языках необходимо заранее знать количество элементов списка, что заставляет в месте создания списка знать лишнюю деталь реализации. Либо приходится создавать какой-нибудь генератор, который вызовут уже «наверху» . Здесь же мы можем просто создать бесконечный список, а нужную часть из него возьмут тогда, когда она потребуется.

Еще посмотрите здесь:
http://forum.vingrad.ru/forum/topic-326400.html
http://norniel.livejournal.com/6085.html
Stanislav Yackovskiy
Stanislav Yackovskiy
58 057
Лучший ответ