19

阅读本文后,我了解到>=>Kleisli 箭头)只是组合函数的高阶函数,它返回“一元值”。例如:

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

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

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

val f: A => B = ...
val 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)
  • 我们能从这些法则中推导出一元法则吗?这些定律和一元定律等效吗?
4

1 回答 1

12

你在这里看到的是这个构造是一个类别的直接结果。

  1. 是的,他们确实符合。并且它们符合确实是它们被称为Kleisli的原因,因为 Kleisli 箭头加上类型形成了monad 的Kleisli 类别(每个 monad 都产生)。这也是为什么这样unit称呼的原因:它是Kleisli箭头组成的单位。
  2. 是的,它们可以派生。使用转换(f <=< g) x = f =<< (g x)(其中<=<is andThen,并且=<<可能类似于flip(bind)Scala 中的内容)。推导的确切步骤可以在这里找到。
于 2014-02-01T17:59:40.560 回答