是否有组成Kleisli内同胚的有趣例子?

Mic*_*ael 2 scala scalaz kleisli

这是我上一个问题的后续行动

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

我们使用函数A => M[A],其中M是monad,形成a monoid,因此我们可以轻松地组合它们.

现在我想知道是否还有其他有趣的组成这些函数的例子.

Ken*_*ida 6

学习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
Run Code Online (Sandbox Code Playgroud)

之后(使用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
Run Code Online (Sandbox Code Playgroud)

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