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

Другие вопросы по тегам