バイアス応用関数(partially applied function)


偏応用関数関数に必要なすべてのパラメータを指定する必要がない式です.代わりに、一部のみを指定するか、必要なパラメータを指定しません.
def sum(a:Int,b:Int,c:Int)=a+b+c

val a=sum _

a(1,2,3)
 
scalaコンパイラは式、sum_をバイアスで適用します.3つの欠落した整数パラメータを有する関数値をインスタンス化し、この新しい関数値のインデックスを変数aに与える.この新しい関数値を3つのパラメータに適用すると、sumを呼び出し、この3つのパラメータ:1、2、3に戻る.
実際に発生したことは,aという変数が関数数値オブジェクトを指すことである.この関数値はscalaコンパイラによって関数式sum_がバイアス適用され、自動的に生成されるクラスのインスタンスです.コンパイラが生成したクラスにはapplyメソッドに3つのパラメータがある.scalaコンパイラは式a(1,2,3)を関数値に対するapplyメソッドの呼び出しに翻訳する.従ってa(1,2,3)はa.apply(1,2.3)の短いフォーマットである.
scalaコンパイラは式sum_に基づいて自動生成クラスのapplyメソッドは,この3つの欠落したパラメータを単純にsumに移動し,計算結果を返す.
この下線は、すべてのパラメータリストを表す式のもう一つの用途であり、変換関数(def)を関数値とする方法である.メソッドやネスト関数を変数に付与したり、パラメータとして他のメソッドに渡したりすることはできませんが、メソッドやネスト関数を名前の後に下線を付けることで関数値にパッケージすればできます.
下線は一部のパラメータを表します.
val b=sum(1,_:Int,3)

b(2)

すべてのパラメータを省略した偏アプリケーション式を書いている場合はprintln_またはsum_,また、コードの場所には関数が必要です.下線を外してより簡単に表現することができます.
val someNumbers=List(-11,-10,4,12,4)
someNumbers.foreach(println _)
//     
someNumbers.foreach(println)

注:上記はscalaガイドから抜粋したものです(scalaサークルのエビに感謝します).