Created
March 1, 2013 07:35
-
-
Save tpolecat/5063072 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 language.higherKinds | |
object FooExample extends App { | |
// Slice of comonad is where this came up | |
trait Foo[F[_]] { | |
def coflatMap[A, B](f: F[A] => B): F[A] => F[B] | |
} | |
// A non-empty list | |
case class Nel[A](head: A, tail: List[A]) | |
object NelFoo extends Foo[Nel] { | |
// It appears that the return type for recursive calls is not inferred | |
// properly, yet no warning is issued. Providing a return type or | |
// type arguments for the recursive call fixes the problem. | |
def coflatMap[A, B](f: Nel[A] => B) = // ok w/ return type | |
l => Nel(f(l), l.tail match { | |
case Nil => Nil | |
case h :: t => { | |
val r = coflatMap(f)(Nel(h, t)) // ok w/ type args | |
r.head :: r.tail | |
} | |
}) | |
} | |
// Without a recursive call all is well, but with recursion we get a | |
// ClassCastException from Integer to Nothing | |
NelFoo.coflatMap[Int, Int](_.head + 1)(Nel(1, Nil)) // Ok | |
NelFoo.coflatMap[Int, Int](_.head + 1)(Nel(1, List(2))) // CCE | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment