I'm having a problem with scala generics. While the first function I defined here seems to be perfectly ok, the compiler complains about the second definition with:
error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
def >>[B](a: C[B])(implicit m: Monad[C]): C[B] = {
^
What am I doing wrong here?
trait Lifter[C[_]] {
implicit def liftToMonad[A](c: C[A]) = new {
def >>=[B](f: A => C[B])(implicit m: Monad[C]): C[B] = {
m >>= (c, f)
}
def >>[B](a: C[B])(implicit m: Monad[C]): C[B] = {
m >> a
}
}
}
IMPORTANT: This is NOT a question about Monads, it's a question about scala polymorphism in general.
EDIT: Here is my Monad definition
trait Monad[C[_]] {
def >>=[A, B](a: C[A], f: A => C[B]): C[B]
def >>=[B](a: C[B]): C[B]
def apply[A](a: A): C[A]
}
BTW: I'm using scala 2.8RC1
Regards, raichoo
Filling in the blanks in your example, I made this compile:
trait Monad[C[_]] {
def >>=[A, B](f: A => C[B]): C[B]
def >>[B](a: C[B]): C[B]
}
trait Lifter[C[_]] {
class D {
def >>=[A, B](f: A => C[B])(implicit m: Monad[C]): C[B] = {
m >>= f
}
def >>[B](a: C[B])(implicit m: Monad[C]): C[B] = {
m >> a
}
}
implicit def liftToMonad[A](c: C[A]) = new D
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With