1. ホーム
  2. scala

[解決済み] なぜScalaは複数のパラメータリストとリストごとの複数のパラメータの両方を提供するのですか?重複

2023-07-04 20:08:59

質問

複数のパラメータリスト、例えば def foo(a:Int)(b:Int) = {} というように、リストごとに複数のパラメータを指定することができます。 def foo(a:Int, b:Int) = {} は私が知る限り意味的に同等であり、ほとんどの関数型言語では複数のパラメータを宣言する方法は1つしかありません(例:F#)。

これらのスタイルの関数定義の両方をサポートする唯一の理由は、1つのパラメータしかないパラメータリストを使用した構文のような言語拡張を可能にすることです。

def withBufferedWriter(file: File)(block: BufferedWriter => Unit)

という構文で呼び出せるようになりました。

withBufferedWriter(new File("myfile.txt")) { out =>
  out write "whatever"
  ...
}

しかし、複数のパラメータリストを持たずに中括弧の使用をサポートする他の方法があり得ます。

関連する質問:なぜScalaでは複数のパラメータリストを使用することを"currying"と呼ぶのでしょうか?Currying は通常、部分的な適用をサポートするために n-ary の関数を unary にする技術として定義されます。しかし、Scalaでは、関数のquot;curried"(各1つのパラメータを持つ複数のパラメータリスト)バージョンを作成しなくても、関数を部分的に適用することができます。

どのように解決するのですか?

などができるようになります。

scala> def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
foo: (as: Int*)(bs: Int*)(cs: Int*)Int

scala> foo(1, 2, 3)(4, 5, 6, 7, 9)(10, 11)
res7: Int = 3906