2016-08-05 11 views
2

私はscalaを初めて使っています。Scala Currying構文の説明

は、私は私の質問は、我々は、追加機能は、別の関数を返していることを言っているされて

object PlainSimple { 

def main(args:Array[String]) 
{ 
val m = add(5) 
println(m(3)) 
} 

def add(x:Int):Int=>Int = 
{ 
    y=>y+x 
} 

} 

コードの下に、この構文を理解したいですか?

Int=>Intの意味は?

追加機能の内部では、yと呼ばれていますか?なぜどこで宣言しなくてもそれを使用していますか?

複数の行を追加メソッド内に追加するにはどうすればよいですか?

+0

関連:http://stackoverflow.com/questions/24086444/scala-syntax-help -currying?rq = 1 – Elazar

+0

あなたの質問は良いことですが、それはカレーとは関係ありません。 SOのドキュメントには、カリングとその使用方法に関する[複数の例](http://stackoverflow.com/documentation/scala/1636/currying#t=201608051605514578482)があります。 – jwvh

答えて

2

を使用しますadd関数が別の関数を返すことはありますか?

Int => Intとは何ですか?タイプとして

T => UTを取り、Uを返す関数」を意味します。したがって、関数シグネチャの末尾に: Int => Intと書くと、「this関数はIntからIntに関数を返します」と言います。

「y」と呼ばれる機能の中に?なぜどこで宣言しなくてもそれを使用していますか?式x => body(又は複数のパラメータの(x,y,z) => body)として

リテラル関数であり、それはそれは、そのパラメータx名前と、その本体bodyされる匿名関数を定義しています。したがって、=>の左側の名前を記述して、パラメータxを宣言しています。

複数の行を追加メソッド内に追加するにはどうすればよいですか?

あなたはdefを使用する方法を定義するときにも=の右側に置くことができ=>の右側には、何も置くことができます。あなたはあなたの関数の体は、複数の文から成るようにしたいのであれば、あなたは普通のメソッド定義と同じように中括弧を使用することができます。

y => { 
    val z = y+x 
    z*2 
} 
6

私の質問はどこですか?add関数は別の関数を返しています。

右ここ

def add(x: Int): Int => Int = y => y + x 

Int => Int関数型です。それはちょうど糖衣構文ですが、あなたも今すぐ

def add(x:Int): Function1[Int, Int] = y => y + x 

としてそれを書くことができ、 y何ですか? y => y + xはラムダ、すなわち無名関数です。このラムダは、現在我々が参照している1つのパラメータを yとしています。ここで

は匿名Scalaでは関数とその構文の良い参考です:http://docs.scala-lang.org/tutorials/tour/anonymous-function-syntax.html

メソッド内で複数行を持つためにちょうど私の質問は、私たちがどこを言っているのさ中括弧

def add(x:Int): Function1[Int, Int] = { y => 
    println("whaveter") 
    y + x 
} 
+0

おそらく 'def add(x:Int)(y:Int):Int = y + x'についての説明を追加し、' add(5)_ 'でそれを呼び出すことができます。 – Elazar