Подтвердить что ты не робот

Различие между Haskell Lazy и Strict monads (или трансформаторами)

При просмотре Hackage большинство монадов имеют Lazy и Strict версию. В чем же разница? Можете ли вы выделить его некоторыми примерами для общих монадов (State, Reader, Writer)?

4b9b3361

Ответ 1

Я не знаю разделения на ленивые и строгие для монады-читателя, причина разделения State(T) и Writer(T) там не применяется.

Разница между ленивыми и строгими монадами Writer и State соответственно. их монадные трансформаторы представляют собой реализацию монадической привязки (>>=), fmap и т.д. В строгих версиях шаблон реализации совпадает с парой ((result, state), resp. (result, message)), заставляя ее оценивать ( не оценка его компонентов), в то время как ленивые версии используют там неопровержимый шаблон ~(a,w), который не заставляет оценивать пару.

ленивые версии позволяют некоторым приложениям не использовать строгие версии, например

foo = do
    xs <- take 100 `fmap` sequence (repeat someAction)
    doSomethingWith xs

sequence бесконечного списка действий может только начать выдавать свой результат, если (>>=) монады достаточно ленив.

С другой стороны, использование ленивых версий часто приводит к накоплению больших thunks в парах (result, state) и, следовательно, к пробелам и/или времени.

Итак, предлагаются оба варианта, и вы можете выбрать, который лучше всего подходит вашим потребностям.