クラスからメソッドを切り離すことは可能ですか?
class A {
def b(C): D
}
b
またはのシグネチャを持つ関数を受け取って返す関数はありますA => C => D
か(A,C) => D
?
クラスからメソッドを切り離すことは可能ですか?
class A {
def b(C): D
}
b
またはのシグネチャを持つ関数を受け取って返す関数はありますA => C => D
か(A,C) => D
?
多くの場合、引数が 1 つのメソッドから新しい二項関数を明示的に作成する必要はありません。コンパイラがそのような関数型を想定している場合は、代わり_ methodName _
に無名関数に対して中置演算子構文を使用できるためです。
1 つ目_
はターゲット オブジェクト (A のインスタンス) の代わりになり、2 つ目_
はメソッドへの引数の代わりになります。
たとえば、潜在的な使用場所があった場合
def swizzle(f: (A, C) => D) = sys.error("todo")
b
次に、次のようにメソッドを参照できます。
swizzle(_ b _)
これを行う関数についてはわかりませんが、そのような関数を作成するのは簡単です:
val f: A => C => D = a => c => a b c
部分的に適用された関数を作成するメソッドのパラメーター グループをアンダースコアに置き換えることで、メソッドを関数に持ち上げることができます。
これには非抽象メソッドが必要なので、例を少し修正します。
case class C()
case class D()
class A {
def b(c: C): D = {
val d: D = D()
println("A.b("+c+") = "+d)
d
}
}
したがって、関数は次のようになります
val afunc: A => C => D = (a: A) => a.b _
引数の例をいくつか指定して関数を呼び出しています ...
afunc(new A)(C())
出力
A.b(C()) = D()
この概念はeta 拡張と呼ばれます。Scala 言語仕様の関連部分は次のとおりです。
次の 4 つの暗黙的な変換は、一部の引数リストに適用されないメソッドに適用できます。
評価。型のパラメーターなしのメソッドは、バインドされている式を評価することによって常に
m
型に変換されます。=> T
T
m
暗黙のアプリケーション。メソッドが暗黙のパラメーターのみを受け取る場合、§7.2 の規則に従って暗黙の引数が渡されます。
イタ拡張。それ以外の場合、メソッドがコンストラクターではなく、予期される型 pt が関数 type(Ts ) ⇒ T
である場合、式に対して eta-expansion (§6.26.5) が実行されますe
。
アプリケーションを空にします。それ以外の場合、e
メソッド type があれば、()T
暗黙的に空の引数リストに適用され、yield しe()
ます。