是否有构成 Kleisli 自同态的有趣示例?

Are there interesting examples of composing Kleisli endomorphisms?

这是我之前

的后续

我们可以定义一个通过路径 (List[String], XmlNode) => Option[XmlNode] 查找 XML 节点的函数作为通过名称获取子节点的函数 (String, XmlNode) => Option[XmlNode] 的组合。

我们利用函数 A => M[A] 的事实,其中 M 是一个单子,形成一个 monoid,因此我们可以轻松地组合它们。

现在我想知道是否还有其他有趣的组合此类函数的示例。

学习 Scalaz 的骑士任务示例

http://eed3si9n.com/learning-scalaz/A-knights-quest.html

之前

def in3: List[KnightPos] =
  for {
    first <- move
    second <- first.move
    third <- second.move
  } yield third

def canReachIn3(end: KnightPos): Boolean = in3 contains end

之后(使用 scalaz.Endomorphic)

val moveK: Kleisli[List, KnightPos, KnightPos] = Kleisli(_.move)

def in(n: Int): List[KnightPos] =
  moveK.endo.multiply(n).run.run(this)

def canReachIn(n: Int, end: KnightPos): Boolean = in(n) contains end

https://gist.github.com/xuwei-k/c77aa4e19c0b4d4c10e2/revisions