如何在Scala中使用占位符定义恒等函数?

ltqd579y  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(63)

我尝试在lambda表达式中使用占位符来表达恒等函数,将(x => x)写成(_)。然而,它并没有给予我想要的结果:

scala> :t (1 to 5).map(_ + 1)
IndexedSeq[Int]
                                                                                                                      
scala> :t (1 to 5).map(_)
(Int => Any) => IndexedSeq[Any]

字符串
是什么让第二个lambda不同于第一个lambda(就类型而言)?难道不是应该用x => x替换的语法糖吗?

piwo6bdm

piwo6bdm1#

Scala关于下划线的长度的规则可能有点复杂,但可以肯定的是,单独的下划线并不表示函数。

(1 to 5).map(_ + 1)

字符串
这不是一个单独的下划线。它是_,并应用了函数.+(1),因此它等效于

(1 to 5).map( x => x + 1)


另一方面,在一项研究中,

(1 to 5).map(_)


在这里,whole 调用实际上被吸收到下划线语法中,因此参数位于最前面。

x => (1 to 5).map(x)


正如注解中所指出的,下划线语法是针对非常特定的用例的,如果你的意思有一点点模糊(这里肯定是),你应该写一个显式的lambda。

(1 to 5).map(x => x)


或者只使用内置函数。

(1 to 5).map(identity)

相关问题