【发布时间】:2015-06-12 21:19:23
【问题描述】:
如您所知,casbah mongodb 驱动程序具有这样的更新功能:
def update [A, B] (q: A, o: B)(implicit arg0: (A) ⇒ DBObject, arg1: (B) ⇒ DBObject) : WriteResult
我想我理解 scala 的柯里化概念。但是,据我所知,这个更新功能应该是这样使用的:
collection.update(MongoDBObject(...), MongoDBObject(...))
这让我很困惑。由于我没有填写更新方法的第二个参数列表,我认为上面的表达式会返回一个类似的函数:
(implicit arg0: (A) ⇒ DBObject, arg1: (B) ⇒ DBObject) => WriteResult
然而事实并非如此。是因为第二个函数参数列表中参数的隐式定义吗?
【问题讨论】:
-
如果你有一个
A => DBObject类型的隐式值和B => DBObject的隐式值,那么在调用update时会应用这些值。不过,如果您只想部分应用该功能,您应该可以通过调用collection.update(MongoDBObject(...), ...) _(附加下划线)来实现 -
我不明白它是如何在范围内的。我想我需要查看柯里化实现下面的源代码,才能完全理解它确实在范围内。我很难理解什么时候在范围内或不在范围内
-
我不知道 casbah,所以我可能帮不了你。然而,这与其说是关于柯里化,不如说是关于隐含。看起来在这种情况下,只需要currying来允许添加隐式参数(因为你不能指定例如
def f(a: int, implicit b: Int),但由于某种原因只能指定def f(a: Int)(implicit b: Int))也许你可以更新问题以包括所有导入,所以可以能够找出隐含在范围内的位置。 -
但是在这种情况下,第二个参数列表不是从第一个参数列表中提供的吗?
-
类型推断将根据第一个参数列表确定泛型类型
A和B,但除此之外,第一个参数列表不会影响第二个。我的猜测是你导入的东西定义了implicit def f(x: MongoDBObject): DBObject。