opciones mundo monadas imprimir impresion hola hacer functores ejemplos como ciclos haskell monads lazy-evaluation

mundo - imprimir en haskell



Diferencia entre las mónadas perezosas y estrictas(o transformadores) de Haskell (1)

Al explorar Hackage, la mayoría de las mónadas tienen una versión perezosa y una versión estricta. ¿Cuál es exactamente la diferencia? ¿Puede resaltarlo con algunos ejemplos para las mónadas comunes (Estado, Lector, Escritor)?


No sé de una separación en perezoso y estricto para la mónada del lector, el motivo de la separación del State(T) y del Writer(T) no se aplica allí.

La diferencia entre el Writer perezoso y estricto y State mónadas State resp. sus transformadores de mónada son la implementación del enlace monádico (>>=) , fmap , etc. En las versiones estrictas, las patrones de implementación coinciden en el par ( (result, state) , resp. (result, message) ), forzando su evaluación ( no la evaluación de sus componentes), mientras que las versiones perezosas usan un patrón irrefutable ~(a,w) allí, que no obliga a la evaluación del par.

Las versiones perezosas permiten algunas aplicaciones que no son posibles para las versiones estrictas, por ejemplo,

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

la sequence de una lista infinita de acciones solo puede comenzar a entregar su resultado si la (>>=) de la mónada es lo suficientemente perezosa.

Por otro lado, el uso de las versiones perezosas a menudo conduce a la acumulación de thunk grandes en los pares (result, state) , y por lo tanto a fugas de espacio y / o tiempo.

Por lo tanto, se ofrecen ambas variantes, y puede elegir la que mejor se adapte a sus necesidades.