хвостато-рекурсивные функции в монадах

Jan 24, 2007 19:54

Когда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:

loop = do
cmd <- getLine
if (cmd == ":q")
then return ()
else loop

чуть-чуть кода и много вопросов )

монады, haskell, программирование

Leave a comment

Comments 22

rvp74 January 24 2007, 16:59:20 UTC
Может стоит вопрос поставить иначе: возможен ли тут memory leak?

Reply

lomeo January 24 2007, 17:05:57 UTC
Без проблем, давай так вопрос поставим :-)
Возможен тут меморилик? Нет? Почему нет?

Reply

rvp74 January 24 2007, 17:16:12 UTC
считай что оператор (>>=) конструирует замыкание, которое когда будет запущенно сначала вызывает левую часть. Потом вызывает правую часть, которая просто возвратит новое замыкание. И дальше управление будет передано ему. Это и будет хвостовая рекурсия, поскольку возвращается тот же объект-замыкание

Reply

rvp74 January 24 2007, 17:26:32 UTC
Мой тебе совет. Возьми ocaml или lisp и реализуй свой монаду. Эти вопросы исчезнуть.
У меня монада была реализована как замыкание. Насколько я помню IO реализованна так же.

Reply


thesz January 24 2007, 17:03:56 UTC
Обычно советуют инлайнить >>= и return.

Поэтому проблем не возникает. Обычно. ;)

Reply

lomeo January 24 2007, 17:06:22 UTC
Где советуют? Я найти не могу просто, потому и спрашивал.

Reply

thesz January 24 2007, 17:30:23 UTC
Советуют в главе GHC User's Guide про оптимизацию программ - Quicker, faster, smaller. В районе прагмы inline.

Reply

rvp74 January 24 2007, 17:20:15 UTC
инлайнить не обязательно. Так как утечки и так не будет

Reply


rvp74 January 25 2007, 07:43:20 UTC
http://rvp74.livejournal.com/31500.html
Я добавил там кое-что по мотивам этого треда. ;)

Reply

lomeo January 25 2007, 10:57:58 UTC
Ага, вижу :-)

Reply


Leave a comment

Up