Skip to content

Instantly share code, notes, and snippets.

@mberndt123
Last active June 6, 2018 08:29
Show Gist options
  • Save mberndt123/737e5f223d5b7a40b081770fca00d322 to your computer and use it in GitHub Desktop.
Save mberndt123/737e5f223d5b7a40b081770fca00d322 to your computer and use it in GitHub Desktop.
import matryoshka.Recursive
import scalaz.Functor
import matryoshka.implicits._
import matryoshka._
sealed trait Tree
case object Empty extends Tree
case class Node(left: Tree, right: Tree) extends Tree
sealed trait TreeF[+A]
case object EmptyF extends TreeF[Nothing]
case class NodeF[+A](left: A, right: A) extends TreeF[A]
object TreeF {
implicit val functor: Functor[TreeF] = new Functor[TreeF] {
override def map[A, B](fa: TreeF[A])(f: A => B): TreeF[B] = fa match {
case EmptyF => EmptyF
case NodeF(left, right) => NodeF(f(left), f(right))
}
}
}
object Tree {
implicit val rec: Recursive.Aux[Tree, TreeF] = new Recursive[Tree] {
override def project(t: Tree)(implicit BF: Functor[TreeF]): TreeF[Tree] = t match {
case Empty => EmptyF
case Node(left, right) => NodeF(left, right)
}
override type Base[A] = TreeF[A]
}
}
RecursiveOps[Tree, TreeF](Node(Empty, Empty): Tree)(Tree.rec) // compiles
RecursiveOps (Node(Empty, Empty): Tree)(Tree.rec) // doesn't compile
// Error:(34, 93) inferred kinds of the type arguments (A$A129.this.Tree.rec.Base[A]) do not conform to the expected kinds of the type parameters (type F).
// A$A129.this.Tree.rec.Base[A]'s type parameters do not match type F's expected parameters:
// type Base has one type parameter, but type F has one
// def get$$instance$$res1 = /* ###worksheet### generated $$end$$ */ RecursiveOps (Node(Empty, Empty): Tree)(Tree.rec);
^
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment