Scala: Как получить контекстный список [t] преобразование здесь?

StackOverflow https://stackoverflow.com/questions/7313956

  •  26-10-2019
  •  | 
  •  

Вопрос

Это мой первый вопрос здесь, так что надеюсь, что я предоставлю достаточно деталей. Не стесняйтесь просить разъяснения.

Принимая во внимание следующее, что работает:

implicit def optionBsonReader[T, U](implicit ev: BsonReader[T, U]) = new BsonReader[Option[T], Option[U]] {
  def read(obj: Option[U]): Option[T] = {
    obj match {
      case Some(x) => Some(x.fromBson[T])
      case None => None
    }
  }
}

Этот кусок кода преобразует опцию, обернутые кусочки BSON в другой опцию [T]. Я думал, что то же самое будет работать для списков, но следующее не компилируется:

implicit def listBsonReader[T, DBObject](implicit ev: BsonReader[T, DBObject]) = new BsonReader[List[T], MongoCursor] {
  def read(cur: MongoCursor): List[T] = {
    cur.map(_.fromBson[T]).toList
  }
}

Я использую следующий код для общей механики:

package object bson {

  def bsonReader[A, B](implicit reader: BsonReader[A, B]) = reader
  def bsonWriter[A, B](implicit writer: BsonWriter[A, B]) = writer

  implicit def addWriter[A](any: A): WithWriter[A] = new WithWriter(any)
  implicit def addReader[A](any: A): WithReader[A] = new WithReader(any)
}

package bson {
  private[bson] class WithWriter[A](any: A) {
    def toBson[B](implicit writer: BsonWriter[A, B]): B = writer.write(any)
  }
  private [bson] class WithReader[B](any: B) {
    def fromBson[A](implicit reader: BsonReader[A, B]): A = reader.read(any)
  }
}

Ошибка компилятора:could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

Это поражает меня как странного, так как кажется, что компилятор пытается оценить T до того, как Frombson был вызван для обеспечения типа. Это поражает меня особенно странным, поскольку у читателя опционов, похоже, нет таких жалоб. Я только недавно начал кодировать в Scala всерьез, поэтому я уверен, что я что -то упускаю здесь.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и надеюсь, что вы можете помочь.

Лучший,

Дирк

Это было полезно?

Решение

В вашем списке. DbObject => X функция Я думаю, у тебя есть что -то вроде

implicit def withFromBson[U](x: U) = new {
   def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}

В карте, с _ напечатано DBObject, это довольно обычно смотрю от BsonReader[T, DBObject]. Анкет Вы не предоставляете ни одного в неявном масштабе, только BsonReader[T,U]. Анкет Просто удалите U и пусть ваш неявный параметр будет BsonReader[T,DBObject].

Компилятор не пытается оценить T заблаговременно. Он пытается убедиться, что все T а также U может быть на сайте Call, (в данном случае, U проблема), у него будет неявный BSonReader[T, DBObject]Это нужно в неявном масштабе. Я думаю, что в общей среде нет. Вы обещаете с вашим неявным параметром, что вы дадите один BsonReader[T,U] на сайте звонка. Это не то, что ему нужно. Где параметр не подразумевается (вам придется написать EV при звонке fromBson), у вас будет аналогичная ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top