хвостато-рекурсивные функции в монадах
Jan. 24th, 2007 07:54 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Когда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:
Например, эта функция выглядит как
Я здесь хвостатости не вижу. Я предполагаю, что реализация
Чтобы было ясно, что я имею в виду:
Откуда следует, что
Кто подскажет?
loop = do
cmd <- getLine
if (cmd == ":q")
then return ()
else loop
Например, эта функция выглядит как
loop = getLine >>= \cmd ->
if (cmd == ":q")
then return ()
else loop
Я здесь хвостатости не вижу. Я предполагаю, что реализация
(>>=)
такова, что bind
переводит запись c foo = m >>= foo
в хвостовую рекурсию. Чтобы было ясно, что я имею в виду:
instance Monad Identity where
return a = Identity a
m >>= k = k (runIdentity m)
Откуда следует, что
f = m >>= f
преобразуется в f = f (runIndentity m)
. Но, с другой стороны, это только в случае инлайна будет возможна такая оптимизация. И фиг знает, что там с другими монадами. Полагаю, что их тоже можно развернуть в хвостатую запись. Может быть кто нибудь поможет с объяснением или ссылкой - почему так? Может быть на это влияет семантика монад, в частности то, что в m >>= f
f
не будет выполнено до тех пор, пока не будет выполнен m
.Кто подскажет?
no subject
Date: 2007-01-24 05:03 pm (UTC)Поэтому проблем не возникает. Обычно. ;)
no subject
Date: 2007-01-24 05:06 pm (UTC)no subject
Date: 2007-01-24 05:30 pm (UTC)no subject
Date: 2007-01-24 05:20 pm (UTC)no subject
Date: 2007-01-24 05:31 pm (UTC)no subject
Date: 2007-01-25 12:30 am (UTC)(Кстати переписал на схему)
no subject
Date: 2007-01-25 10:48 am (UTC)Это выяснилось не так давно в нашем проекте.
no subject
Date: 2007-01-25 10:55 am (UTC)no subject
Date: 2007-01-25 11:59 am (UTC)При этом все количества вызовов в программе по профайлеру линейно от количества тиков, которые надо просимулировать.
У меня получилась сложность вроде такой: время симуляции в секундах T=2e-7*N2+0.00015*N+5. N - количество эмулируемых тиков. T(1000) = 5.35, а вот T(100000) = 2020, 34 минуты.
Неприятно, но жить можно и времени заниматься уже нет. :(