При просмотре Hackage большинство монадов имеют Lazy и Strict версию. В чем же разница? Можете ли вы выделить его некоторыми примерами для общих монадов (State, Reader, Writer)?
Различие между Haskell Lazy и Strict monads (или трансформаторами)
Ответ 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)
и, следовательно, к пробелам и/или времени.
Итак, предлагаются оба варианта, и вы можете выбрать, который лучше всего подходит вашим потребностям.