scala - 使用丰富我的库对匿名函数进行类型推断

标签 scala anonymous-function type-inference enrich-my-library

假设我有一个方法可以将(两个元素上的函数)转换为(两个序列上的函数):

def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f

换句话说,结果函数采用两个序列 xsys ,并创建一个由 (xs(0) f ys(0), xs(1) f ys(1), ...) 组成的新序列
因此,例如,如果 xssSeq(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/

相关文章:

scala - 创建部分应用函数时的类型推断

scala - 为 scala 开发一个 IDE 是个好主意吗?

scala - 什么版本库spark支持SparkSession

matlab - 如何将参数传递给函数句柄,但仅在调用时解释它?

javascript - 是否有可能访问与 JavaScript 中的函数实例关联的闭包中捕获的变量

c# - 如何推断具有继承类型的类型参数?

scala - 将 Scala 对象/伴生对象作为参数类型传递

scala - 找不到参数 F : cats. Applicative[F] 的隐式值

function - 创建函数字典的更好方法

swift - "_"类型在快速错误消息中意味着什么?