Scala: «Тип параметра в структурном уточнении может не относиться к абстрактному типу, определенному вне этого уточнения» - PullRequest
4 голосов
/ 21 апреля 2010

У меня проблема с генериками скалы. В то время как первая функция, которую я здесь определил, выглядит вполне нормально, компилятор жалуется на второе определение:

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

Ответы [ 2 ]

10 голосов
/ 21 апреля 2010

Заполняя пробелы в вашем примере, я сделал эту компиляцию:

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
}
0 голосов
/ 21 апреля 2010

Спасибо, это действительно помогло. Ваш ответ указал мне в правильном направлении. Я написал вещь к этому:

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

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

С уважением, raichoo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...