我现在有这个设置,在这里我有一个方法和一些隐式资源,该方法返回一个函数,我以后可以在我的代码中使用。
type AResource = Int
def testA(s: String)(implicit aResource: AResource): (Double) => (String, Int) = (d: Double) => {
(s + d, d.toInt * aResource)
}
implicit val ar:AResource = 3
val fA = testA("org: ")
fA(3.1415)这将像预期的那样打印(org: 3.1415,9)。到目前一切尚好
然而,有时我想要在一个单线器中调用此方法,这迫使我将隐式显式化。
val fA2 = testA("org2: ")(ar)(1.123)这似乎有点麻烦,但问题实际上要复杂一些,因为我的方法使用了TypeTag并将隐式typeTag注入到函数中。
我所要寻找的是一种定义testA的方法,这样返回函数就实现了is。
像这样(显然不起作用)
def testB(s: String): (Double, AResource) => (String, Int) = (d: Double)(implicit aResource: AResource) => {
(s + d, d.toInt * aResource)
}但那样我就可以跑了
testB("org2: ")(1.123)担心在最低层次上引发的情绪
更新:
我至少找到了这个解决方案,但还不是百分之百完美
def testC(s: String): (Double) => (AResource) => (String, Int) = (d: Double) => { implicit aResource: AResource => {
(s + d, d.toInt * aResource)
}}
val c:(String, Int) = testC("org: ")(2.4)(ar)它确实将隐式向下移动,但我仍然必须传递硬编码。
更新2:
Tim为玩具问题提供了一个很好的解决方案,但只起作用,因为在定义过程中,隐式资源已经在范围内。

当隐式从作用域中移除时,定义将失败。
发布于 2021-01-15 14:25:33
您可以将它写成一个curried函数,并在第一次使用时使用Eta展开:
def testC(s: String)(d: Double)(implicit aResource: AResource) =
(s + d, d.toInt * aResource)
val fC = testC("org: ") _
fC(3.1415)
testC("33")(2.0)以前的不正确答案
您可以这样实现testB:
def testB(s: String) = {
def f(d: Double)(implicit aResource: AResource) = (s + d, d.toInt * aResource)
f _
}你可以把这叫做两种方式:
val fB = testB("org: ")
fB(3.1415)
testB("org2: ")(1.123)这是因为隐式解析是在testB内部完成的,而不是在调用f时完成的。
https://stackoverflow.com/questions/65737568
复制相似问题