別の Scala 初心者の質問。
次の違いを見つけようとしています:
def _1_sumUntil(n: Int) = (f: Int => Int) => (0 to n).toList.foldLeft(0){(a,b) => a + f(b)}
と
def _2_sumUntil(n: Int)(f: Int => Int) = (0 to n).toList.foldLeft(0){(a,b) => a + f(b)}
他のものよりも利点は何ですか(もしあれば)?
Int => Int1 つ目は からまでの関数を返す 1 つのパラメータ リストをInt持つメソッドで、2 つ目は を返す 2 つのパラメータ リストを持つメソッドIntです。
技術的には、eta 展開と呼ばれるもの (メソッドを透過的に関数値に変換できる) を使用して、2 番目の方法を部分的に適用し、最初の方法と同じ関数を生成できます。
val a = _1_sumUntil(33) // (Int => Int) => Int
val b = _2_sumUntil(33) _ // (Int => Int) => Int via eta-expansion
私のアドバイスは、2 番目のバリアントを使用し、明示的な関数値を避けることです。2 番目の利点は、eta-expansion を使用しない限り、関数値が ( に渡された関数を除いて) インスタンス化さfoldLeftれずに適用されることです。また、読みやすさも申し分ありません。
Int => Intメソッドの主な目的がtoIntから渡される関数を実際に提供することである場合にのみ、最初のバージョンを使用します。