¿Cómo funciona el siguiente código Haskell, `f a = (\ f ‘-> return. F’ = << a) = << f`?

No lo hace! Es solo una definición de . Si desea tener alguna intuición al respecto, puede elegir algunos valores para aplicarlos.

> let g = Just (+2); y = Solo 3 en g y
Solo 5
> let g = Nada; y = Solo 3 en g y
Nada
> let g = Just (+2); y = Nada en g y
Nada

De acuerdo, al menos para la mónada Quizás, la función envuelta en el argumento izquierdo se aplica al valor envuelto en el argumento derecho, a menos que cualquiera de los valores sea Nothing, entonces obtenemos Nothing. Eso debería darnos algo de intuición.

Alternativamente, podría intentar reformular la definición de una manera que pueda ser más clara para usted. Aquí hay un intento.

f a = (\ f ‘-> return. f’ = << a) = << f

– Primero voltearé los operadores de enlace.
f a = f >> = \ f ‘-> a >> = retorno. F’

– Luego abstraiga la variable del enlace interno
f a = f >> = \ f ‘-> a >> = \ a’ -> (return. f ‘) a’

– Y reescribir en notación do
f a = do
f ‘<- f
a ‘<- a
volver (f ‘a’)

En el contexto de nuestro ejemplo usando la mónada Quizás, quizás ahora pueda ver lo que está sucediendo. Intentamos vincular los valores envueltos f ‘y a’, y dado que es la mónada Quizás, hacemos un corto al resultado Nothing si f o a es Nothing. Si no, aplicamos f ‘a a’ y ajustamos el resultado en Just (la definición de retorno para Quizás). Como ya sabrán, los resultados pueden ser drásticamente diferentes para otras mónadas, pero pensar en uno a la vez es bastante útil. . ¡Ahora puedes intentar resolverlo con, quizás, list!