haskell - que - monadas leibniz
¿Por qué el transformador de mónada ListT se considera defectuoso? ¿Qué leyes de mónada se rompen? (1)
He visto mencionada que
ListT
es un ejemplo clásico de un transformador de mónada con errores que no cumple con las leyes de mónada .
¿Se puede demostrar esto con un simple ejemplo?
Edit: Mi idea con ListT []
está un poco equivocada, me perdí que la documentation requiere que la mónada interna sea conmutativa. Entonces, ¿es ListT
Buggy solo en el sentido que tiene este requisito, o hay otro problema? (Los ejemplos en la wiki de Haskell utilizan ListT IO
y IO
obviamente no es conmutativo).
Un ejemplo simple que muestra cómo falla la ley de asociatividad:
v :: Int -> ListT [] Int
v 0 = ListT [[0, 1]]
v 1 = ListT [[0], [1]]
main = do
print $ runListT $ ((v >=> v) >=> v) 0
-- = [[0,1,0,0,1],[0,1,1,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1]]
print $ runListT $ (v >=> (v >=> v)) 0
-- = [[0,1,0,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0,1],[0,1,1,0],[0,1,1,1]]
Se pueden encontrar más ejemplos (principalmente con IO
) y una solución sobre cómo corregir ListT
en ListT .