我在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
怎么能提供比_
更多的信息?
答案 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 => String
(fs
),并且您希望将所有这些函数应用于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。