2015-10-08 7 views
2

Это является продолжением до моего предыдущего questionЕсть ли интересные примеры составления эндоморфизмов Клейсли?

Мы можем определить функцию, которая находит узел XML по пути (List[String], XmlNode) => Option[XmlNode] в виде композиции функций (String, XmlNode) => Option[XmlNode], которые получают дочерний узел по имени.

Мы используем тот факт, что функции A => M[A], где M является монадой, образуют monoid, и поэтому мы с легкостью их можем скомпоновать.

Теперь я задаюсь вопросом, есть ли другие интересные примеры составления таких функций. Пример задания

ответ

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 

после (используйте 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

+0

Хороший пример. Благодарю. – Michael