假设我有一个方法可以将(两个元素上的函数)转换为(两个序列上的函数):
def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
换句话说,结果函数接受两个序列xs
and ys
,并创建一个由(xs(0) f ys(0), xs(1) f ys(1), ...)
So 组成的新序列,例如,如果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
方法,我还尝试了丰富我的库模式:
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]
? 还是我对类型推断的要求太多了?