Last active
February 15, 2024 11:20
-
-
Save fancellu/65200623b7349ccba366593a73378ccb to your computer and use it in GitHub Desktop.
Example of Tree Functor usage in Cats
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Branch(990,Leaf(1230),Branch(1000,Leaf(20),Leaf(30))) | |
Branch(990!,Leaf(1230!),Branch(1000!,Leaf(20!),Leaf(30!))) | |
Branch(!099,Leaf(!0321),Branch(!0001,Leaf(!02),Leaf(!03))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cats._ | |
object TreeFunctorExample { | |
def main(args: Array[String]): Unit = { | |
sealed trait Tree[+T] | |
case class Leaf[+T](value: T) extends Tree[T] | |
case class Branch[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] | |
// casting up because of cats invariance | |
object Tree { | |
def leaf[T](v: T): Tree[T] = Leaf(v) | |
def branch[T](v: T, l: Tree[T], r: Tree[T]): Tree[T] = Branch(v, l, r) | |
} | |
import Tree._ | |
implicit object TreeFunctor extends Functor[Tree] { | |
override def map[A, B](fa: Tree[A])(f: A => B): Tree[B] = fa match { | |
case Leaf(v) => Leaf(f(v)) | |
case Branch(v, l, r) => Branch(f(v), map(l)(f), map(r)(f)) | |
} | |
} | |
val tree = branch(99, leaf(123), branch(100, leaf(2), leaf(3))) | |
def times10[F[_]](f: F[Int])(implicit func: Functor[F]): F[Int] = func.map(f)(_ * 10) | |
def addBang[F[_]](f: F[String])(implicit func: Functor[F]): F[String] = func.map(f)(_+"!") | |
val multiplied = times10(tree) | |
println(multiplied) | |
val excited = addBang(TreeFunctor.map(multiplied)(_.toString)) | |
println(excited) | |
import cats.syntax.functor._ | |
val reversed=excited.map(_.reverse) | |
println(reversed) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A similar example, but with a custom LinkedList
https://gist.github.com/fancellu/91a948d1042f996cf843f7090df62ae7