阅读此article后,我了解到>=>(Kleisli箭头)只是组成函数的高阶函数,它们返回“单值”。例如:

值f:A => M [B] = ...
值g:B => M [C] = ...

val h:A => M [C] = f> => g //用Kleisli箭头组成f和g


它看起来像是由“简单”函数组成的简单组合(即返回简单值的纯函数):

值f:A => B = ...
值g:B => C = ...

val h = f,然后g; //组成f和g


现在我猜想这个“简单”的构成andThen符合某些法律


身份:f andThen g == gg andThen f == g用于身份功能:f[A](a:A):A = a
关联性:(f1 andThen f2) andThen f3 == f1 andThen (f2 andThen f3)


现在我的问题是:


>=>是否符合身份为f(a:A) = M[a].unit(a)的那些法律?
我们可以从那些定律中得出单子定律吗?这些法律和单子法是等效的吗?

最佳答案

您在这里拥有的是category这种构造的直接结果。


是的,它们确实符合要求。它们的一致性确实是被称为Kleisli的原因,因为Kleisli箭头加类型形成了monad的Kleisli category(每个monad都产生了)。这也是为什么unit如此称呼的原因:它是Kleisli箭头组成的单位。
是的,它们可以派生。使用转换(f <=< g) x = f =<< (g x)(其中<=<andThen,而=<<可能类似于Scala中的flip(bind))。推导的确切步骤可以在here中找到。

10-04 23:33