Рекурсия

Nov 30, 2012 17:48

Я это как-то писал, но напишу ещё раз, бо тема поднялась.

Недостатки явной рекурсии по сравнению с комбинаторами (ага, zip3):

  • Рекурсия непонятна (согласен, это субъективное).
  • Обычно используется с декомпозицией, нарушая инкапусляцию.
  • Всегда используется для работы с элементами, вместо работы с коллекцией ( wholemeal programming).
  • Цепочка вызовов ( Read more... )

haskell, рекурсия

Leave a comment

Comments 52

inv2004 November 30 2012, 13:53:58 UTC
Могу только поддержать.

Reply

mrparker October 4 2013, 17:24:44 UTC
Могу только плюсанутся...

Reply


nealar November 30 2012, 13:56:27 UTC
Когда сложность кода - уровня хелловорда, рекурсия понятна. А когда его становится побольше, уже надо спасаться комбинаторами.

Reply

lomeo November 30 2012, 14:27:08 UTC
Я стараюсь использовать её для реализации комбинаторов. Ну, т.е. вот есть модуль с объявленным типом, сначала, конечно typeclass morphism, потом более конкретные функции для этого типа. И вот всё это можно и через рекурсию. А наружу уходят чистые комбинаторы.

Reply

thedeemon November 30 2012, 15:45:09 UTC
>сначала, конечно typeclass morphism

Вот об этом было бы интересно подробнее послушать.

Reply

lomeo November 30 2012, 15:58:14 UTC
Да собственно тут всё сказано.

Зачем нам алгебраические структуры в самом деле? Чтобы их использовать! :-)

Ну, и в нагрузку ещё немножко про дизайн от Люка Палмера (правда, это оффтопик).

Reply


miserakl November 30 2012, 16:48:01 UTC
> Ну и ссылочка, куда без неё!

Кажется, ссылка потерялась, и ЖЖ вместо неё подставил адрес текущей страницы.

Reply

lomeo November 30 2012, 17:20:02 UTC
:-) Явная рекурсия - зло.

Reply

miserakl November 30 2012, 18:45:17 UTC
А, так это специально. Небось до вечера пятницы тоже нарочно откладывали? :)

Reply

nealar November 30 2012, 19:06:10 UTC
Отложенные вычисления :)

Reply


nivanych November 30 2012, 20:03:57 UTC
Можно ещё такой довод.
Структурная рекурсия, это один простой паттерн, легко укладывающийся в довольно простой Тьюринг-худой язык.
А значит, имеем простой и предсказуемый reasoning.
Что вполне подтверждается на практике.
Общая рекурсия заставляет думать в рамках уже Тьюринг-полноты, что в общем случае, неразрешимо даже теоретически, а не то, чтобы уложилось человеку в голову.
Конечно же, при реальном программировании, возникает ряд "паттернов" (навроде отслеживания разборки значения индуктивного типа), иначе бы было очень сложно сделать что-то.
Ну вот, структурная рекурсия, это один из таких паттернов - простой, чОтко формализованный и весьма общий.

Reply

lomeo November 30 2012, 20:55:28 UTC
Один раз реализовать свёртку полезно для типа ;-) Хотя сейчас уже deriving Foldable есть.

Reply

nivanych December 1 2012, 07:22:14 UTC
> полезно для типа

Ему от этого становится лучше, да! ;-)

Reply


swizard November 30 2012, 20:39:36 UTC
А можно вот такой теоретический вопрос: как предлагается заменять, например, двойную (или более широкую) рекурсию комбинаторами?

Reply

lomeo November 30 2012, 21:05:38 UTC
1. "Избегайте" /= "Никогда не используйте".
2. Этот пост возник из-за этой дискуссии. Т.е. "как заменить" уже есть.

Не стоит заменять. Если нужно, скажем, делать разбор двух структур по условию, то я пишу рекурсивный код. Пример: merge двух сортированных списков.

Reply

swizard November 30 2012, 21:54:42 UTC
Понятно, спасибо.

Reply

thesz November 30 2012, 21:31:43 UTC
А что это такое?

В качестве возможного примера могу предложить Omega monad: http://hackage.haskell.org/package/control-monad-omega

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

Reply


Leave a comment

Up