example - reader monad learn you a haskell
¿Leyes de la mónada expresadas en términos de unirse en lugar de vincularse? (1)
Robado directamente de Wikipedia :
(La transformación natural η: 1 -> T
es pure
; la transformación natural µ: T^2 -> T
está join
)
µ . Tµ = µ . µT
En Haskell:
join . fmap join = join . join
En inglés: si comienza con tres capas de mónada como mmma :: Monad m => m (m (ma))
, no importa si alisa la capa interna primero y luego la externa, o si la superficie exterior la aplana primero y entonces interior Esta es la misma ley que lo que enumeras como tercero (asociatividad).
µ . Tη = µ . ηT = 1
En Haskell:
join . fmap pure = join . pure = id
En inglés: si comienza con una capa de mónada como ma :: Monad m => ma
, no importa si crea una nueva capa en su interior y luego la aplana, o si crea una nueva capa fuera de ella y luego aplanarlo, y ambos son lo mismo que no hacer nada en absoluto. Esta ley es una combinación de tus dos primeros.
Las leyes de la mónada se describen tradicionalmente en términos de >>=
y pure
:
pure a >>= k = k a
m >>= pure = m
m >>= (/x -> k x >>= h) = (m >>= k) >>= h
Sin embargo, las mónadas también se pueden definir en términos de join
lugar de >>=
. Me gustaría proponer una formulación de las leyes de la mónada en términos de join
.
Usando x >>= f = join (fmap fx)
, es fácil reescribir las leyes de mónadas existentes para eliminar >>=
. Simplificando ligeramente los resultados con la ayuda de las leyes aplicativas, las dos primeras leyes se expresan de manera muy agradable:
join . pure = id
join . fmap pure = id
La intuición para estas leyes es fácil, también, ya que claramente, la introducción de una "capa" adicional con pure
debería ser una operación cuando se combina con join
. La tercera ley, sin embargo, no es tan bonita. Termina pareciéndose a esto:
join (fmap (/x -> join (fmap h (k x))) m)
= join (fmap h (join (fmap k m)))
Esto no reduce agradablemente el uso de las leyes aplicativas, y es mucho más difícil de entender sin mirarlo por un tiempo. Ciertamente no tiene la misma intuición fácil.
¿Existe una formulación alternativa equivalente de las leyes de la mónada en términos de join
que sea más fácil de entender? Alternativamente, ¿hay alguna forma de simplificar la ley anterior o de hacerla más fácil de asimilar? La versión con >>=
ya es menos agradable que la expresada con la composición de Kleisli, pero la versión con join
es casi ilegible.