功能组合,Kleisli箭头和Monadic法则

时间:2014-02-01 15:21:29

标签: scala functional-programming monads kleisli

阅读此article后,我了解到>=> Kleisli arrow )只是一个组合函数的高阶函数,它返回“monadic values”。例如:

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

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

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

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

val h = f andThen g; // compose f and 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)的法律?
  • 我们可以从这些法律中得出一元法吗?这些法律和一元法律是否相同?

1 个答案:

答案 0 :(得分:11)

你所拥有的是这种结构的直接结果是category

  1. 是的,他们确实符合。并且它们符合确实是他们被称为 Kleisli 的原因,因为Kleisli箭头加上类型形成monad的Kleisli category(每个monad引起)。这也是为什么unit被调用的原因:它是Kleisli箭头组成的单位。
  2. 是的,它们可以衍生出来。使用转化(f <=< g) x = f =<< (g x)(其中<=<andThen=<<可能类似于Scala中的flip(bind)。可以找到推导的确切步骤here