6

Scala での次の 2 つの関数定義の違いは何ですか。

1)def sum(f: Int => Int)(a: Int, b: Int): Int = { <code removed> }

2)def sum(f: Int => Int, a: Int, b: Int): Int = { <code removed> }

?

SBT のコンソール REPL は、それらに異なる値を与えるため、それらが何らかの形で異なるかどうかを調べます。

sum: (f: Int => Int, a: Int, b: Int)Int

sum: (f: Int => Int)(a: Int, b: Int)Int

4

2 に答える 2

4

最初の定義はcurriedであるため、別のときにaandを提供できます。b

たとえば、現在のメソッドで使用する関数がわかっているが、引数がまだわからない場合は、次のように使用できます。

def mySum(v: Int): Int = v + 1
val newsum = sum(mySum) _

この時点で、は 2 つの を受け取り、 を返すnewsum関数です。IntInt

合計のコンテキストでは、あまり意味がないようです。しかし、プログラムの一部について、今は知っているがパラメータがまだわからない (またはアクセスできない) ことに基づいて、さまざまなアルゴリズムを返したいと思ったことはたくさんあります。

カリー化はその機能を購入します。

于 2013-09-26T19:43:02.853 に答える
2

Scala 関数は、カリー化を支援するために複数のパラメーター リストをサポートしています。最初の例から、最初のsum関数を 2 つの整数を取り、関数を引数として取ることができる別の関数 (つまりcurries ) を返すものとして見ることができます。Int => Int

この構文は、新しい構文のように見えて動作する関数を作成するためにも使用されます。たとえば、次のdef withResource(r: Resource)(block: => Unit)ように呼び出すことができます。

withResource(res) { 
    ..
    ..
}
于 2013-09-26T19:38:51.047 に答える