2

別の 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)}

他のものよりも利点は何ですか(もしあれば)?

4

1 に答える 1

3

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から渡される関数を実際に提供することである場合にのみ、最初のバージョンを使用します。


この質問この質問も参照してください。

于 2013-07-31T16:32:53.480 に答える