Scala 中的自动类型参数推断

Automatic type-argument inference in scala

我试图实现类似于以下的功能:

def myMap[A,B](a: Seq[A], f: A => B): Seq[B] = a.map(f)

// then I want to call it like that:
myMap(List(1,13,42), _*2)

但是对 myMap 的调用无法编译,因为编译器无法推断类型参数 AB。错误:missing parameter type

基本上,我希望它能推断出 A (Int) 给定的参数 List(1,13,42),然后从给定的 f = _*2 知道 A 推断出 B。但事实并非如此。

我该怎么做才能避免写类型参数?

我找到的最好的是:

def myMap[A,B](a: Seq[A], f: A => B): Seq[B] = a.map(f)
myMap(List(1,13,42), (a: Int) => a*2)

即我在 f 参数

中明确给出 A

我找到了一种方法,使用隐式 class:

implicit class MyMap[A](a: A) {
  def myMap[B](f: A => B): B = f(a)
}

// then I can call
List(1,13,42).myMap(_*2)

使用多个参数列表。

def myMap[A,B](a: Seq[A])(f: A => B): Seq[B] = a.map(f)

// then call it like this:
myMap(List(1,13,42)) (_*2)

集合 api 大量使用这种风格 foldLeft 和类似的功能。 你可以查看官方风格指南here.