是否有构成 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
这是我之前
我们可以定义一个通过路径 (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