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-25 06:54 am (UTC)
From: [identity profile] rvp74.livejournal.com
Для для каждого вида монады надо отдельный подход. В случае List Monad будет все по другому:

leak = do {a <- [1,2,3] ; leak }


Не проверял. Но думаю, 100% будет утечка.

Date: 2007-01-25 07:15 am (UTC)
From: [identity profile] rvp74.livejournal.com
хм, этот код странно себя ведет:
leak !! 1000 замерает. На Сtrl-C не реагирует.

А вот код leak arg = do { a <- [1,2,3]; leak a }
как раз ведет себя как и ожидалось:
stack overflow на leak 1 !! 1000

Date: 2007-01-25 10:57 am (UTC)
From: [identity profile] lomeo.livejournal.com
Понял, значит моё предположение о принадлежности этого свойства всем монадам неверно.

Надо будет поглядеть насчёт списков внимательнее, а то я не пойму ни фига - с чего это leak без аргументов не течёт

Date: 2007-01-25 12:15 pm (UTC)
From: [identity profile] rvp74.livejournal.com
Не течет потому что ghci на leak !! 1000 ничего не делает (загрузка ЦП 0%).
Может deadlock какой случился с ghci? :)

Date: 2007-01-25 12:38 pm (UTC)
From: [identity profile] rvp74.livejournal.com
leak = leak ++ (leak ++ leak)

это после инлайнинга. Это выражение тоже ничего не делает, когда запускаю leak !! 1000

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. 12th, 2025 05:18 am
Powered by Dreamwidth Studios