Are there interesting examples of composing Kleisli endomorphisms?
Это продолжение моего предыдущего вопроса
Мы можем определить функцию, которая находит узел XML по пути (List[String], XmlNode) => Option[XmlNode]
как композиция функций (String, XmlNode) => Option[XmlNode]
которые получают дочерний узел по имени.
Мы используем тот факт, что функции A => M[A]
, где M
это монада, образуют monoid
и поэтому мы можем легко составить их.
Теперь мне интересно, есть ли другие интересные примеры составления таких функций.
1 ответ
Решение
Пример квеста рыцаря из изучения Скалаза
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