lomeo: (лямбда)
[personal profile] lomeo
Когда мы пишем монадическую функцию с хвостовой рекурсией, то явно эта функция не хвостато-рекурсивная:

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.

Кто подскажет?

Date: 2007-01-24 05:03 pm (UTC)
From: [identity profile] thesz.livejournal.com
Обычно советуют инлайнить >>= и return.

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

Date: 2007-01-24 05:06 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Где советуют? Я найти не могу просто, потому и спрашивал.

Date: 2007-01-24 05:30 pm (UTC)
From: [identity profile] thesz.livejournal.com
Советуют в главе GHC User's Guide про оптимизацию программ - Quicker, faster, smaller. В районе прагмы inline.

Date: 2007-01-24 05:20 pm (UTC)
From: [identity profile] rvp74.livejournal.com
инлайнить не обязательно. Так как утечки и так не будет

Date: 2007-01-24 05:31 pm (UTC)
From: [identity profile] thesz.livejournal.com
Тут интересней наличие хвостовой рекурсии. Дима сказал, что если синлайнить, то она может быть использована.

Date: 2007-01-25 12:30 am (UTC)
From: [identity profile] lomeo.livejournal.com
А разве в данном случае это не одно и тоже? Утечка же не только по хипу бывает, но и по стеку.
(Кстати переписал на схему)

Date: 2007-01-25 10:48 am (UTC)
From: [identity profile] thesz.livejournal.com
Утечка памяти может изменить показатель степени в O(Nm) времени работы программы.

Это выяснилось не так давно в нашем проекте.

Date: 2007-01-25 10:55 am (UTC)
From: [identity profile] lomeo.livejournal.com
Прикольно! Это с чем связано, не пойму? Или это аппроксимация опытной оценки?

Date: 2007-01-25 11:59 am (UTC)
From: [identity profile] thesz.livejournal.com
Хип растет, время на его сканирование тоже. Вот и получается сумма арифметической прогрессии.

При этом все количества вызовов в программе по профайлеру линейно от количества тиков, которые надо просимулировать.

У меня получилась сложность вроде такой: время симуляции в секундах T=2e-7*N2+0.00015*N+5. N - количество эмулируемых тиков. T(1000) = 5.35, а вот T(100000) = 2020, 34 минуты.

Неприятно, но жить можно и времени заниматься уже нет. :(

Profile

lomeo: (Default)
Dmitry Antonyuk

April 2024

S M T W T F S
 123456
7891011 1213
14151617181920
21222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 17th, 2025 03:08 am
Powered by Dreamwidth Studios