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)
}

Большое спасибо.

С уважением, Райчу

Другие вопросы по тегам