Bar と呼ぶ Foos のコレクションを持つクラスがあります。Foo には、次のように Bar レベルで集計したい数値を返すメソッドがいくつかあります。
def attribute1(inputs: Map[Int, Double]) =
foos.foldLeft(0d)((sum, foo) => sum + foo.attribute1(inputs(foo.id)))
これらのさまざまな属性を集約するために、次の形式の n 関数を使用できます。
def attributeN(inputs: Map[Int, Double]) =
foos.foldLeft(0d)((sum, foo) => sum + foo.attributeN(inputs(foo.id)))
しかし、それは醜いです-反復と合計が繰り返されるという事実は嫌いです。それを抽象化したいので、次のようなことができます:
def attribute1(inputs: Map[Int, Double]) = aggregate(Foo.attribute1, inputs)
private def aggregate(f: Double => Double) = foos.foldLeft(0d)((sum, foo) => sum + foo.f(inputs(foo.id)
もちろん、 Foo.attribute1 を関数として参照できないため、これは機能しません。関数インスタンスではありません。
私は基本的にさまざまな解決策に出くわしましたが、すべての結果は、少なくともヘルパーを使用しない場合と同じくらい冗長または複雑な各集計方法のコードになり、反復の重複が残っています。
ここで期待しすぎているだけかもしれませんが、これを行うためのエレガントな方法があることはほぼ確実です。Scala は私を逃れています。ですから、ここで答えてくれる Scala 達人なら誰でも - 事前に感謝します!