Scala中用占位符定义恒等函数的问题及类型差异解析
为什么Scala中
map(_)和map(x => x)的类型不一致? 先看你给出的代码示例:
scala> :t (1 to 5).map(_ + 1) IndexedSeq[Int] scala> :t (1 to 5).map(_) (Int => Any) => IndexedSeq[Any]
问题的核心是Scala对占位符_的解析规则有差异:
- 当
_出现在具体表达式中(比如_ + 1),编译器会把它解析为当前函数的参数占位符,等价于x => x + 1,此时map直接接收这个函数并执行,最终返回IndexedSeq[Int]类型的结果。 - 但当
_单独作为参数传递时,它的语义完全不同:编译器会将其解析为高阶函数的参数占位符,相当于你写了f => (1 to 5).map(f)——这个表达式本身是一个函数,它接收一个Int => Any类型的函数作为输入,然后返回对应的IndexedSeq[Any],而非直接执行map操作。
所以(_)并不是(x => x)的语法糖,只有当_被嵌入到具体运算或表达式上下文里时,才会被解析为单参数的占位符。如果想实现恒等函数的效果,直接写map(x => x),或者使用Scala标准库提供的identity函数:map(identity),这两种写法都会得到IndexedSeq[Int]的类型。
内容的提问来源于stack exchange,提问作者kotleta2007
相关产品推荐
相关产品推荐

