2

次のように、1 つの明示的パラメーターと 1 つの暗黙的パラメーターを受け取る関数を定義したいと思います。

def foo(a: Int)(implicit b: Int) : Int

しかし、クラスまたはオブジェクトとして、そのように

object Foo extends ((Int,Int) => Int) {
  def apply(a: Int)(implicit b: Int) : Int = { ... }
}

関数を次のように呼び出すことができるようにします。

implicit val b = 2
val g = Foo(1)

Fooクラスが正しく拡張されるベースの宣言を取得できません。これはどのように行うことができますか?

4

4 に答える 4

5

それはいけません。Function2[T1, T2, R]は抽象メソッドapply(t1: T1, t2: T2): Rを宣言しているため、 Function2を混在させたい場合は、異なるシグネチャを持つこのアリティ 2 のapplyメソッドを実装する必要があります。使用したいカレーバージョンよりも。

于 2012-04-24T09:37:32.940 に答える
0

したがって、この質問には2つの部分があります。1つは、カレーパラメータリストを使用して関数を実装するオブジェクトをどのように作成するかです。そして、どのようにしてそれらのパラメータリストの1つを暗黙的にするのでしょうか。

それらの最初のものは間違いなく可能です。カリー化された関数は、関数を返す関数であることに注意してください。つまりf(x: Int)(y: Int)、実際には、Function1ではなく、Function2です。

scala> def f(x: Int)(y: Int) = x + y
f: (x: Int)(y: Int)Int

scala> f _
res0: Int => Int => Int = <function1>

そして、あなたは確かにこれを実装するクラスを作成することができます:

scala> object Foo extends (Int => Int => Int) {
     |   def apply(x: Int) = {(y: Int) => x + y}
     | }
defined module Foo

scala> Foo(1)(2)
res1: Int = 3

残念ながら、2番目のパラメータリストを暗黙的にする方法を私は知りません。

于 2012-04-24T14:04:36.260 に答える
0

問題は、そのオブジェクト Foo を「(Int,Int) => Int が期待される場所」に渡す必要があるのはなぜですか?

オブジェクト Foo には、関数であることを超えてそれを拡張する特別な機能がいくつかあると思いますか?

ここで 2 つの懸念事項を分離する方がよいようです: a) 関数 (Int)(implicit Int) => Int および b) オブジェクト Foo

object Foo {
  def apply(a: Int, b: Int) : Int = { ... }
}

def foo(a: Int)(implicit b: Int) : Int = Foo(a, b)

implicit val m:Int = 42

foo(5)  // --> res1: Int = 47

必要に応じて、「foo」を「コンパニオン関数」と見なすことができます...

それに加えて、 (Int)(implicit Int)=>Int 「(Int,Int) => Int が期待される場所」を適用しようとすると、これらの型が同一ではないため、機能しない可能性があります。少なくともそれを

def bar(f:(Int,Int)=>Int) = ....

メソッド bar は、パラメータ f を 2 つの引数で呼び出します。これは、引数が 2 つ必要であり、f で提供された関数が実際に暗黙的に動作できると想定できないためです。

于 2012-04-24T15:29:28.477 に答える
0

拡張するのではなく(Int, Int) => Int、暗黙の変換を使用できます。

class Foo(f: (Int, Int) => Int) {
  def apply(a: Int)(implicit b: Int) : Int = f(a, b)
}

implicit def Foo_to_Function2(foo: Foo) = (x: Int, y: Int) => foo(x)(y)

テスト:

val foo = new Foo(_ * 10 + _)
foo(4) //error since no implicit Int yet
{
  implicit val impint = 5
  foo(4)  //45
}  
def takesF2(f: (Int, Int) => Int) = f(1, 2)
takesF2(foo)  //12 - works as normal Function2
于 2012-04-24T14:13:29.287 に答える