阅读此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 == g
和g 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中找到。