假设我有一个方法可以将(两个元素上的函数)转换为(两个序列上的函数):
def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
换句话说,结果函数采用两个序列
xs
和 ys
,并创建一个由 (xs(0) f ys(0), xs(1) f ys(1), ...)
组成的新序列因此,例如,如果
xss
是 Seq(Seq(1,2),Seq(3,4))
和 f
是 (a: Int, b: Int) => a + b
,我们可以这样调用它:xss reduceLeft seqed(f) // Seq(4, 6)
或使用匿名函数:
xss reduceLeft seqed[Int](_+_)
这很好;去掉
[Int]
就好了type 参数,但我不知道如何(任何想法?)。为了让它感觉更像
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]
?还是我对类型推断的要求太多了?
最佳答案
你不能随心所欲,但看 Function.tupled
,这是 .tupled
的对应部分这解决了同样的问题。
scala> List(1, 2, 3) zip List(1, 2, 3) map (_ + _).tupled
<console>:8: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
List(1, 2, 3) zip List(1, 2, 3) map (_ + _).tupled
^
<console>:8: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
List(1, 2, 3) zip List(1, 2, 3) map (_ + _).tupled
^
scala> List(1, 2, 3) zip List(1, 2, 3) map Function.tupled(_ + _)
res7: List[Int] = List(2, 4, 6)
关于scala - 使用丰富我的库对匿名函数进行类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328748/