(2 つの要素に対する関数) を (2 つのシーケンスに対する関数) に変換するメソッドがあるとします。
def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
つまり、結果の関数は 2 つのシーケンスxs
とを取りys
、 で構成される新しいシーケンスを作成します。(xs(0) f ys(0), xs(1) f ys(1), ...)
たとえば、xss
isSeq(Seq(1,2),Seq(3,4))
とf
is(a: Int, b: Int) => a + b
の場合、次のように呼び出すことができます。
xss reduceLeft seqed(f) // Seq(4, 6)
または無名関数で:
xss reduceLeft seqed[Int](_+_)
これはかなり良いです。型引数を取り除くのはいいことですが、[Int]
方法がわかりません (アイデアはありますか?)。
メソッドのように感じさせるためにtupled
、enrich-my-library パターンも試しました。
class SeqFunction[T](f: (T,T) => T) {
def seqed: (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
}
implicit def seqFunction[T](f: (T,T) => T) = new SeqFunction(f)
事前定義された関数の場合、これはうまく機能しますが、匿名の関数では醜いです
xss reduceLeft f.seqed
xss reduceLeft ((_:Int) + (_:Int)).seqed
型が推論されるようにこれを再定式化できる別の方法はありますか?次のような構文を使用できます。
// pseudocode
xss reduceLeft (_+_).seqed // ... or failing that
xss reduceLeft (_+_).seqed[Int]
? それとも、型推論を求めすぎているのでしょうか?