gpt4 book ai didi

Scala:如何在这里进行上下文绑定(bind)的 List[T] 转换?

转载 作者:行者123 更新时间:2023-12-02 02:22:55 24 4
gpt4 key购买 nike

这是我的第一个问题,所以希望我能提供足够的细节。随时要求澄清。

考虑以下因素,这是可行的:

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

这段代码将 Option 包装的 BSON 片段转换为另一个 Option[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)
}
}

编译错误:找不到参数读取器的隐式值:project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

这让我觉得很奇怪,因为编译器似乎在调用 fromBson 以提供类型之前尝试评估 T。这让我觉得特别奇怪,因为选项读者似乎没有这样的提示。我最近才开始认真地使用 Scala 编写代码,所以我确定我在这里遗漏了一些东西。

如果您需要更多信息,请告诉我,希望您能提供帮助。

最好的,

德克

最佳答案

在您的 listBsonReader 中,没有理由使用 U 类型。您的光标在 DBObject 上迭代,map 需要一个 DbObject => X 函数。我猜你有类似的东西

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

在 map 中,_ 类型的 DBObject,从 BsonReader[T, DBObject] 看是很正常的。您在隐式范围内不提供任何内容,仅提供 BsonReader[T,U]。只需删除 U 并将隐式参数设置为 BsonReader[T,DBObject]

编译器未尝试提前评估 T。它试图确保无论 TU 可能在调用点,(在这种情况下,U 是问题所在),它都会在隐式范围内具有它需要的隐式 BSonReader[T, DBObject]。估计一般环境是没有的。您 promise ,使用您的隐式参数,您将在调用站点提供一个 BsonReader[T,U]。这不是它所需要的。如果参数不是隐式的(在调用 fromBson 时必须编写 ev),就会出现类似的错误。

关于Scala:如何在这里进行上下文绑定(bind)的 List[T] 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com