Guest User

Untitled

a guest
Feb 22nd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.75 KB | None | 0 0
  1. import cats._
  2.  
  3. sealed trait Tree[+A]
  4. final case class Branch[A](left: Tree[A], right: Tree[A]) extends Tree[A]
  5. final case class Leaf[A](value: A) extends Tree[A]
  6.  
  7. object Tree {
  8.  
  9. implicit val treeMonad: Monad[Tree] = new Monad[Tree]{
  10. override def pure[A](a: A): Tree[A] = Leaf(a)
  11.  
  12. override def flatMap[A, B](fa: Tree[A])(f: A => Tree[B]): Tree[B] = fa match {
  13. case Branch(l, r) => Branch(flatMap(l)(f), flatMap(r)(f))
  14. case Leaf(a) => f(a)
  15. }
  16. override def tailRecM[A, B](a: A)(f: A => Tree[Either[A, B]]): Tree[B] = {
  17. def go(tree: Tree[Either[A, B]]): Tree[B] = tree match {
  18. case Leaf(Left(a)) => tailRecM(a)(f)
  19. case Leaf(Right(b)) => Leaf(b)
  20. case b@Branch(_, _) => go(b)
  21. }
  22. go(f(a))
  23. }
  24. }
  25.  
  26.  
  27. }
Add Comment
Please, Sign In to add comment