Scala:将隐式参数传递给函数,该函数返回另一个函数

时间:2017-06-16 09:05:55

标签: scala implicit

让我们说,我有四个班级

class I
class A
class B
class C

带有两个参数的函数,其中一个是隐式的,并返回另一个函数:

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 param missing parameter type error上的c。好的,我们明确地添加这个参数:

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

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

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

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

但我们始终无法访问隐含值。此外,我们可以将函数调用分为两个表达式:

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

这给了我们需要的东西,但代码似乎很麻烦。我想调用函数更简单。

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

3 个答案:

答案 0 :(得分:3)

我认为Implicitly适合您的用例。

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

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

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

希望这有帮助。

答案 1 :(得分:3)

另一个选择是明确写apply

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

答案 2 :(得分:0)

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

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

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

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