Scalaの関数カリー化(カリー化)
(カリー化を)カリーすると、元の関数を参照する処理のパラメータを受け入れ、新しい関数に2つのパラメーターを受け入れます。 新機能は、2番目のパラメータは、パラメータの本来の機能である返します。
例
まず、関数を定義します。
def add(x:Int,y:Int)=x+y
私たちが適用されたときだから、それは次のように使用する必要があります。add(1,2)
今、私たちは、この機能変更の形を見てみましょう。
def add(x:Int)(y:Int) = x + y
私たちが適用されたときにそう、それは次のように使用する必要があります:(1)(2)、最終的な結果は同じですaddが、このアプローチ(プロセス)がカリー化と呼ばれ、3です。
実行プロセス
(1)(2)実際に順番に関数は、パラメータx、関数型の戻り値を使用して最初の呼び出し、2通常の(非カリー化関数)を呼び出し、2番目のパラメータyが、この関数の型を呼び出すされ追加値。
まず、基本的方法へと進化します:
def add(x:Int)=(y:Int)=>x+y
そして、この関数は、それが何を意味するのでしょうか? パラメータとしてのxを受信し、匿名関数を返す、無名関数の定義は次のとおりです。int引数yを受信すると、関数本体は、x + yです。 今、私たちは、このメソッドを呼び出します。
val result = add(1)
(Y::のInt)=> 1 + yの結果を返し、その結果の値は、匿名関数であるべき
そう結果を得るために、我々は結果をコールし続けます。
val sum = result(2)
最後に、印刷結果は3です。
完全な例
ここでは完全な例であります:
object Test { def main(args: Array[String]) { val str1:String = "Hello, " val str2:String = "Scala!" println( "str1 + str2 = " + strcat(str1)(str2) ) } def strcat(s1: String)(s2: String) = { s1 + s2 } }
上記のコードの実装、出力は次のようになります。
$ scalac Test.scala $ scala Test str1 + str2 = Hello, Scala!