Scala: "Тип параметра в структурном уточнении может не относиться к абстрактному типу, определенному вне этого уточнения"
У меня проблема с генериками скалы. В то время как первая функция, которую я определил здесь, выглядит вполне нормально, компилятор жалуется на второе определение с помощью:
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
С уважением, Райчу
2 ответа
Решение
Заполнив пробелы в вашем примере, я сделал эту компиляцию:
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
}
Спасибо, это действительно помогло. Ваш ответ указал мне в правильном направлении. Я написал вещь к этому:
trait Lifter[C[_]] {
class Wrapper[A](c: C[A]) {
def >>=[B](f: A => C[B])(implicit m: Monad[C]): C[B] = {
m >>= (c, f)
}
def >>[B](b: C[B])(implicit m: Monad[C]): C[B] = {
m >> (c, b)
}
}
implicit def liftToMonad[A](c: C[A]): Wrapper[A] = new Wrapper(c)
}
Большое спасибо.
С уважением, Райчу