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を評価しようとしているように見えるので、奇妙なことです。オプションリーダーにはそのような苦情がないように見えるので、これは特に奇妙なことです。私は最近、Scalaで本格的にコーディングし始めたので、ここで何かが足りないと確信しています。

あなたがより多くの情報が必要な場合は私に知らせてください、そしてあなたが助けることができることを願っています。

一番、

ダーク

役に立ちましたか?

解決

listbsonreaderでは、タイプUの理由はありません。カーソルはdbobjectで繰り返されます。マップは 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 あらかじめ。それは何でも保証しようとしています TU コールサイトにある可能性があります(この場合、 U 問題です)、それは暗黙的です BSonReader[T, DBObject]暗黙の範囲で必要です。一般的な環境には何もないと思います。暗黙のパラメーターで、あなたがそれを与えることを約束します BsonReader[T,U] コールサイトで。それはそれが必要とするものではありません。パラメーターが暗黙的ではない場合(呼び出すときにEVを書く必要があります fromBson)、同様のエラーがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top