Рекурсия

Nov 30, 2012 17:48

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

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

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

haskell, рекурсия

Leave a comment

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

Reply

rigidus December 3 2012, 16:10:19 UTC
Черт побери, мне не очевидно.
Реквестирую решение на лиспе, т.к. haskell пока не понимаю

Reply

some41 December 1 2012, 04:05:18 UTC
compareTopo не является ordering. например, для (a, []), (b, []), (c, [a]) получаем a == b, b == c, a < c. аналогично если возвращать GT (как ниже), то будет a > b, b > a.

Reply

thesz December 1 2012, 10:53:21 UTC
С ошибками даже интересней.

У вас появляется шанс поправить и понять, что не так. ;)

Поправите?

Reply

some41 December 1 2012, 22:47:46 UTC
voidex уже написал правильную функцию сравнения, но делать topological sort через сортировку как-то дико. вместо O(V+E) получается O(logV*V*V). я написал алгоритм из википедии внизу.

Reply

thesz December 1 2012, 23:00:47 UTC
Спасибо!

Я, откровенно говоря, не помнил алгоритма топологической сортировки.

Reply

some41 December 1 2012, 23:34:24 UTC
да там особенно нечего помнить -- он очевиден, никакой хитрости в нем нет. и если честно, то у меня тоже неправильная сложность из-за lookups в Map и Set. но, думаю, все равно лучше, чем с поисками в полностью развернутом графе.

Reply

thesz November 30 2012, 23:51:36 UTC
Что-то мне вспомнилось, что у Луговского, что ли, была либа на Лиспе а-ля SYB. Для работы с языками и их трансляцией.

Он на ней деньги собирался зарабатывать. ;)

Reply

voidex December 1 2012, 00:17:54 UTC
Ну придумать-то можно, вопрос в том, будет ли это понятнее, чем рекурсия в данном случае.
Идея такая:
1. Строим список пар (имя объекта, непосредственные зависимости). Для файла это зависимости, для модуля - имена компонентов.
2. Строим дерево зависимостей, т.е. разворачиваем непосредственные зависимости.
3. Сортируем очевидным образом (зависящий идёт позже, если независимы - по имени)
4. Вуаля

Код без учёта циклических зависимостей: http://hpaste.org/78574

Для учёта идея проста, мы храним "родителей" и смотрим, чтобы текущий от них не зависел: http://hpaste.org/78575

Update

Я был не прав в пункте 3, сортировать не нужно. Вот конечный результат: http://hpaste.org/78585

Reply

nivanych December 1 2012, 09:50:39 UTC
Добавлю мыслей.
Индуктивные типы - это деревья. Графы делают из них и напрямую, без соответствующего вычислятельного контекста, индуктивными типами они не являются.
Тем не менее, для графов можно сделать соответствующие комбинаторы.
Первыми ну просто напрашиваются всякие преобразования в процессе обхода графа в ширину-глубину.
Ещё строят построение (ленивого) дерева обхода и что-то-там с ним дальше делают.

Reply

swizard December 1 2012, 11:13:56 UTC
Круто, спасибо.

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

Reply

some41 December 1 2012, 22:42:14 UTC
у решений с сортировкой совсем не такая сложность, как должна быть у topological sort.

Reply

lomeo December 1 2012, 11:11:32 UTC
Тип содрал у voidex, решение простое: использовать графы и uniplate для выдёргивания всего (аналог listify у thesz). Циклы не проверял.

http://hpaste.org/78589

Reply

nponeccop December 1 2012, 20:38:51 UTC
Теперь осталось только на data types a la carte переделать, завтра попробую, если не опередят. А топсорт - это читерство.

Reply

nponeccop December 1 2012, 22:57:01 UTC
Вот держите обещанную переделку на а ля карт:

http://hpaste.org/78604

Data.Functor.Fixedpoint находится в unification-fd, импорт можно заменить на ровно две строчки:

newtype Fix f = Fix { unFix :: f (Fix f) }
cata phi = phi . fmap self . unFix

Reply

lomeo December 2 2012, 04:03:51 UTC
Красиво.

Reply


Leave a comment

Up