3

この Scala 表記には少し混乱しています。

List(1, 2, 3).foldLeft(0)((x, acc) => acc+x)

"0" と関数はどちらも foldLeft の引数ですが、なぜそれらは 2 つの隣接するブラケット グループに渡されるのですか? 私はこれが機能するようにアスペクトします:

List(1, 2, 3).foldLeft(0, ((x, acc) => acc+x))

しかし、そうではありません。誰かが私にこれを説明できますか? また、そのようなタイプの関数を宣言する方法と理由は? ありがとう

4

3 に答える 3

7

Scala では、複数の引数リストを使用できます。

def foo(a: Int)(b: String) = ???
def bar(a: Int)(b: String)(c: Long) = ???

このような構文を foldLeft に使用する理由は、コンパイラが型を推論する方法にあります。つまり、前の引数グループで既に推論された型が、連続する引数グループの型を推論するために使用されます。foldLeft の場合、 の横に type ascription をドロップできます(x, acc)

List(1, 2, 3).foldLeft(0)((x: Int, acc: Int) => acc+x)

あなたはちょうど書くことができます

List(1, 2, 3).foldLeft(0)((x, acc) => acc+x)
于 2013-11-07T15:13:38.333 に答える
2

Scala では、複数のグループで関数の引数を定義できるため、()

def test(a: String)(b: String)(implicit ev: Something) { }

最も実用的なシナリオは、コンテキストのバインドまたはカリー化が必要な場合です。たとえば、特定のimplicit定義がスコープ内で利用可能です。

たとえば、Futureが期待されimplicit executorます。ここを見てください。

メソッドの定義をfoldLeft見ると、最初の引数がアキュムレータで、2 番目の引数がカリー化に使用される関数であることがわかります。

def foldLeft[B](z: B)(op: (B, A) ⇒ B): B

括弧は、懸念事項を分離するのに非常に便利です。また、メソッドを定義すると、次のようになります。

    def test(a: String)(b: String)
You can't call it with: test("a", "b");
于 2013-11-07T15:13:38.733 に答える