After reading this article I understand that >=> (Kleisli arrow) is just a higher order function to compose functions, that return "monadic values". For example:
val f: A => M[B] = ... val g: B => M[C] = ... val h: A => M[C] = f >=> g // compose f and g with Kleisli arrow
It looks like a simple composition of "simple" functions (i.e. pure functions that return simple values):
val f: A => B = ... val g: B => C = ... val h = f andThen g; // compose f and g
Now I guess this "simple" composition andThen conforms to certain laws
f andThen g == g and g andThen f == g for identity function: f[A](a:A):A = a(f1 andThen f2) andThen f3 == f1 andThen (f2 andThen f3)And now my questions:
>=> conform to those laws, where identity is f(a:A) = M[a].unit(a) ?What you have here is the immediate consequence of this construction being a category.
unit is called like that: it is the unit under composition of Kleisli arrows.(f <=< g) x = f =<< (g x) (where <=< is andThen, and =<< is probably something like flip(bind) in Scala). The exact steps of the derivation can be found here.