7

マルチパラメータグループメソッドのカリー化が可能であることを発見した後、暗黙のパラメータを必要とする部分的に適用された関数を取得しようとしています。

そうすることは不可能です。そうでない場合は、その理由を説明していただけますか?

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 が定義されているスコープで使用したいと考えています。

4

2 に答える 2

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)
}
于 2012-06-04T13:29:18.803 に答える
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
于 2014-07-19T06:27:31.507 に答える