¿Por qué se considera que el transformador de mónada ListT es defectuoso ? ¿ Qué leyes de mónada rompe?


He visto mencionado que

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

¿Se puede demostrar esto con un simple ejemplo?

Editar: Mi idea con ListT [] es un poco equivocada, me perdí que la documentación requiere que la mónada interna sea conmutativa. Por lo tanto, es ListT buggy solo en el sentido de que tiene este requisito, o hay otro problema? (Los ejemplos en Haskell wiki todos usan ListT IO y IO obviamente no es conmutativo.)

Author: Petr Pudlák, 2012-09-27

1 answers

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]]

Más ejemplos (la mayoría usando IO) y una solución para arreglar ListT se pueden encontrar en ListT done right.

 19
Author: Petr Pudlák,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-27 09:12:58