scala中的自动类型参数推断

时间:2016-12-13 11:02:57

标签: scala type-inference generic-type-argument

我尝试实现类似于:

的功能
set-number

但是对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) 的调用无法编译,因为编译器无法推断类型参数myMapA。错误:B

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

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

我找到的最好的是:

A

即。我明确地在def myMap[A,B](a: Seq[A], f: A => B): Seq[B] = a.map(f) myMap(List(1,13,42), (a: Int) => a*2) 参数

中提供了A

2 个答案:

答案 0 :(得分:7)

使用多个参数列表。

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.

答案 1 :(得分:0)

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

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)