У меня проблема с генериками скалы. В то время как первая функция, которую я здесь определил, выглядит вполне нормально, компилятор жалуется на второе определение:
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] = {
^
Что я здесь не так делаю?
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
}
}
}
ВАЖНО: Это не вопрос монад, это вопрос полиморфизма скалы в целом.
РЕДАКТИРОВАТЬ: Вот мое определение монады
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]
}
Кстати: я использую scala 2.8RC1
С уважением,
raichoo