4

私の理解では、部分的に適用された関数は関数であり、必要な引数のすべて/一部を渡さずに呼び出すことができます。

def add(x:Int, y:Int) = x + y
val paf = add(_ :Int, 3)
val paf1 = add(_ :Int, _ :Int)

上記の例では、paf1 は、すべての引数が欠落している部分的に適用された関数を参照しており、呼び出すことがpaf1(10,20)できます。add(10,20)

私の質問は、呼び出し構文がほとんど同じであるため、すべての引数が欠落している部分的に適用された関数を作成することの追加の利点は何ですか? メソッドをファーストクラス関数に変換するだけですか?

4

4 に答える 4

6

Scala のdefキーワードはメソッドを定義する方法であり、メソッドは(Scala では)関数ではありません。したがって、結果を生成する際に引数を使用して行うことにおいて意味的に同等であるとしても、addyour は your のようにファーストクラスの関数エンティティではありません。paf1

Scala は自動的に部分適用を使用して、メソッドを同等の関数に変換します。これは、例を少し拡張することで確認できます。

def add(x: Int, y: Int) = x + y
...
val pa2: (Int, Int) => Int = add
pa2: (Int, Int) => Int = <function2>

これはこの例ではほとんど役に立たないように見えるかもしれませんが、多くの場合、関数が必要であることを示す非明示的な制約 (または、より正確には、他の場所で明示的に指定された制約) があり、(型互換性のある) メソッド名を簡単に指定できます。機能が必要な場所。

于 2013-06-20T01:14:53.140 に答える
2

メソッド関数には違いがあります。

たとえばの宣言を見ると、List.map実際には関数が必要です。しかし、Scala コンパイラは、メソッドと関数の両方を受け入れるほどスマートです。

引用はこちらから

このトリック...関数が期待される場所にメソッドを強制するためのトリックは、コンパイラでさえ検出して実行できるほど簡単です。実際、この自動的な強制には独自の名前があり、イータ拡張と呼ばれます。

一方、Java 8を見てください。私が知る限り、そこはそれほど簡単ではありません。

于 2013-06-20T06:46:12.297 に答える