2012-09-27 28 views
24

que he visto mencionado que¿Por qué el transformador de mónada ListT se considera defectuoso? ¿Qué leyes de mónada se rompen?

ListT es un ejemplo clásico de un transformador mónada con errores que no satisface la monad laws.

¿Se puede demostrar esto con un simple ejemplo?

Editar: Mi idea con ListT [] es un poco mal, que se perdió que el documentation requiere la mónada interior para ser conmutativa. Entonces, ¿ListT tiene errores solo en el sentido de que tiene este requisito, o hay otro problema? (El examples at Haskell wiki todos utilizan ListT IO y IO obviamente no es conmutativa.)

Respuesta

19

Un ejemplo sencillo que muestra la forma en que falla la ley 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]] 

Más ejemplos (en su mayoría utilizando IO) y una solución de cómo solucionar ListT se puede encontrar en ListT done right.

+2

La documentación dice que la mónada transformada debe ser conmutativa; pruébalo con, por ejemplo, 'v n = ListT $ map (leer :: String -> Int). permutaciones. espectáculo . (+ n) ' – applicative

+1

@applicative Buen punto, me lo perdí. Intenté con la mónada '(->)', pero hasta ahora no pude encontrar un contraejemplo. –

+8

Bueno ... se llaman "transformadores de mónada", no "transformadores de mónada conmutativa". Si definiera un transformador que solo funcionara correctamente cuando se aplica a algunas mónadas específicas, ¿alguien lo consideraría satisfactorio? –

Cuestiones relacionadas