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

Lai*_*uan 9 scala type-inference

我在Scala中听到我可以_在匿名函数中用作"匿名参数":

List(1,2,3).foreach(print(_))
Run Code Online (Sandbox Code Playgroud)

但是这段代码无法编译:

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))
Run Code Online (Sandbox Code Playgroud)

这可以:

scala> def a[T](s: Seq[T]): Seq[T] = s.map(x => x)
a: [T](s: Seq[T])Seq[T]
Run Code Online (Sandbox Code Playgroud)

似乎是类型推断.但是怎么能x => x提供更多的信息_呢?

sen*_*nia 14

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

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

i => s.map(i)
Run Code Online (Sandbox Code Playgroud)

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

或类似"a" + _手段"a".+(_)的手段s => "a".+(s).

这在当前的背景下没有意义.

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

fs.map{f => s.map(f)}
Run Code Online (Sandbox Code Playgroud)

或者只是这样:

fs.map{s.map(_)}
Run Code Online (Sandbox Code Playgroud)

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

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

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