在发现currying multi parameter-groups method is possible之后,我试图获得一个需要隐式参数的部分应用函数。
接缝不可能这样做。如果没有,你能解释一下为什么吗?
scala> def sum(a: Int)(implicit b: Int): Int = { a+b }
sum: (a: Int)(implicit b: Int)Int
scala> sum(3)(4)
res12: Int = 7
scala> val partFunc2 = sum _
<console>:8: error: could not find implicit value for parameter b: Int
val partFunc2 = sum _
^
我使用单例对象来创建这个部分应用的函数,我想在定义了隐式int的作用域中使用它。
答案 0 :(得分:8)
这是因为你在范围内没有隐式Int。参见:
scala> def foo(x: Int)(implicit y: Int) = x + y
foo: (x: Int)(implicit y: Int)Int
scala> foo _
<console>:9: error: could not find implicit value for parameter y: Int
foo _
^
scala> implicit val b = 2
b: Int = 2
scala> foo _
res1: Int => Int = <function1>
编译器将隐式替换为实际值。如果你讨论方法,结果是一个函数,函数不能有隐式参数,所以编译器必须在你方法的时候插入值。
编辑:
对于您的用例,为什么不尝试以下内容:
object Foo {
def partialSum(implicit x: Int) = sum(3)(x)
}
答案 1 :(得分:0)
scala> object MySingleton {
| def sum(a: Int)(implicit b: Int): Int = { a+b }
|
|
| def caller(a: Int) = {
| implicit val b = 3; // This allows you to define the partial below
| def pf = sum _ // and call sum()() without repeating the arg list.
| pf.apply(a)
| }
| }
defined module MySingleton
scala> MySingleton.caller(10)
res10: Int = 13