为什么Scala不能推断_的类型?

时间:2013-12-21 19:24:03

标签: scala type-inference

我在Scala中听说我可以在匿名函数中使用_作为“匿名参数”:

List(1,2,3).foreach(print(_))

但是这段代码无法编译:

scala> def a[T](s: Seq[T]): Seq[T] = s.map(_)
<console>:7: error: missing parameter type for expanded function ((x$1) => s.map(x$1))

这可以:

scala> def a[T](s: Seq[T]): Seq[T] = s.map(x => x)
a: [T](s: Seq[T])Seq[T]

似乎关于类型推断。但x => x怎么能提供比_更多的信息?

2 个答案:

答案 0 :(得分:14)

这里的问题不是类型推断。

正如您从错误消息中看到的,s.map(_)的等效代码不是s.map(x => x),而是:

i => s.map(i)

就像print(_)(实际上Predef.print(_))意味着i => Predef.print(i)

或者像"a" + _表示"a".+(_)表示s => "a".+(s)

这在当前背景下没有意义。

假设您有一个函数列表String => Stringfs),并且您希望将所有这些函数应用于String列表。你将使用这段代码:

fs.map{f => s.map(f)}

或只是这个:

fs.map{s.map(_)}

另外:如果identity,您可以使用x => x方法。它是默认导入的,但您可以使用添加导入使其更短:

import Predef.{identity => id}
List(1, 2, 3) map id
// List[Int] = List(1, 2, 3)

请注意,identity是众所周知的名称,因此在团队中您应该使用它而不是别名。

答案 1 :(得分:0)

  

似乎关于类型推断。但x =&gt;怎么可能x提供的信息比_?

更多

x =&gt; x是一种Function1,它是map函数所期望的参数。编译器无法推断出类型T的匿名变量_实际上是一个Function1。