puramente programacion primer orden monadas monad lenguaje funciones funcional elementos ejemplos aplicaciones scala functional-programming monads kleisli

scala - programacion - Composición de funciones, flechas de Kleisli y leyes monádicas.



monadas wikipedia (1)

Lo que tienes aquí es la consecuencia inmediata de que esta construcción sea una category .

  1. Sí, se conforman. Y el hecho de que se conformen es la razón por la que se llaman Kleisli , porque las flechas y los tipos de Kleisli forman la categoría de la mónada Kleisli (a la que da lugar cada mónada). También es por eso que la unit se llama así: es la unidad bajo la composición de las flechas de Kleisli.
  2. Sí, se pueden derivar. Use la transformación (f <=< g) x = f =<< (gx) (donde <=< es andThen , y =<< es probablemente algo así como flip(bind) en Scala). Los pasos exactos de la derivación se pueden encontrar here .

Después de leer este article , entiendo que >=> ( flecha Kleisli ) es solo una función de orden superior para componer funciones, que devuelve "valores monádicos". Por ejemplo:

val f: A => M[B] = ... val g: B => M[C] = ... val h: A => M[C] = f >=> g // compose f and g with Kleisli arrow

Parece una composición simple de funciones "simples" (es decir, funciones puras que devuelven valores simples):

val f: A => B = ... val g: B => C = ... val h = f andThen g; // compose f and g

Ahora supongo que esta composición "simple" y andThen ajusta a ciertas leyes

  • Identidad : f andThen g == g y f andThen g == g y g andThen f == g para la función de identidad : f[A](a:A):A = a
  • Asociatividad : (f1 andThen f2) andThen f3 == f1 andThen (f2 andThen f3)

Y ahora mis preguntas:

  • ¿Se ajusta >=> a esas leyes, donde la identidad es f(a:A) = M[a].unit(a) ?
  • ¿Podemos derivar las leyes monádicas de esas leyes? ¿Son esas leyes y las leyes monádicas equivalentes?