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.