metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-09-13 05:45 pm
Entry tags:

Принудительная хвостовая рекурсия: жрать память вместо стека?

Читаю про катаморфизмы и FSharp. Вообще, изначально это я искал ответ на этот вопрос, но зачитался и забыл.

Там приводится пример, как выразить foldBack (оно же foldr) через fold(оно же foldl) с помощью continuations. И выглядит это как будто мы заменяем использование стека в случае не-tail-recursive функции таким же использованием памяти из head. Причем в случае стека выделение и удаление памяти достаточно дешевое, а вот что будет в случае обычной памяти - вопрос загадочный. Непонятно, есть ли тогда какие-нибудь преимущества у такого преобразования не-tail-recursive функции в tail-recursive?

[identity profile] antilamer.livejournal.com 2010-09-13 05:56 pm (UTC)(link)
Нет никаких преимуществ, обыкновенное извращение.

[identity profile] blacklion.livejournal.com 2010-09-13 05:59 pm (UTC)(link)
Стек, особенно в 32-бит мультитреде, может быть куда меньше хипа.

[identity profile] gds.livejournal.com 2010-09-13 06:12 pm (UTC)(link)
стек бывает ограничен жостко (обычно в опциях линкера устанавливается), тогда как хип растёт согласно имеющейся памяти (а то и своп используется, если есть).
Например, кое-где я использую формально типо-небезопасную библиотеку (хотя там с типами всё хорошо, но не доказано), но чуть более медленную, зато tail-recursive на всех функциях, работающих со списками.

[identity profile] raydac.livejournal.com 2010-09-13 06:31 pm (UTC)(link)
в случае рекурсии прикинь какой у тебя отладочный стек вызовов JVM попытается построить для объекта Exception и это при нехватке памяти то, так что разница есть

[identity profile] usovalx.livejournal.com 2010-09-13 07:26 pm (UTC)(link)
Не знаю как там с производительностью аллокатора в .Net, но в том-же ocaml выделение памяти в куче чудовищно быстрое.

[identity profile] migmit.livejournal.com 2010-09-13 09:01 pm (UTC)(link)
Ну, появляется возможность делать call/cc.

[identity profile] mchrome-cat.livejournal.com 2010-09-14 07:39 pm (UTC)(link)
Кстати, существует книжка от Andrew Appel - "Compiling with continuations", где он по идее (я сам не читал) подробно рассказывает, зачем нужен cps.