Latest web development tutorials

Scalaの関数カリー化(カリー化)

Scalaの機能 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!

Scalaの機能 Scalaの機能