Scala:将隐式参数传递给 returns 另一个函数的函数

Scala: pass implicit argument to function which returns another function

比方说,我有四个 类

class I
class A
class B
class C

并且函数有两个参数,其中一个是隐式的,returns另一个函数:

def f(arg: String)(implicit i: I): (C => B) => A = _ => new A

我在范围内的某处隐含了 I

implicit val i = new I

所以,我想这样调用 f

f("123") { c => new B }

但我不能,因为 lambda 参数 c 上的 missing parameter type error。好的,让我们明确地添加这个参数:

f("123") { c: C => new B }

然后我有类型不匹配:第二个 f 参数需要是 I,而是 C => B!

我现在看到两个选项,如何解决这个问题。首先是简单地显式传递参数:

f("123")(i) { c => new B }

但我们并不总是能够访问隐式值。另外,我们可以将函数调用分为两个表达式:

val g = f("123")
g { c => new B }

这提供了我们所需要的,但代码似乎很繁琐。我想更简单地调用函数。

那么,如何在一行中调用这样的函数呢?

我们可以为这样的函数编写简单的包装器f:

def g(arg: String)(fun: C => B)(implicit i: I) => A = f(arg)(i)(fun)

现在隐式参数实际上是函数的最后一个参数,我们可以这样在一行中调用g

g("123") { c => new B }

我认为 Implicitly 适合您的用例。

f("123")(implicitly[I])((c: C) => new B)

Implicitly 在 Scala 2.8 中可用,在 Predef 中定义为:

def implicitly[T](implicit e: T): T = e

希望这对您有所帮助。

另一种选择是显式写入 apply

f("123") apply { c => new B }
f("123").apply( c => new B )