【问题标题】:Why does this lambda function can't work with `_` in Scala?为什么这个 lambda 函数在 Scala 中不能与 `_` 一起使用?
【发布时间】:2015-01-23 06:25:50
【问题描述】:

在 scala REPL 中,这很好用

scala> (1 to 3).foreach(i => print(i + ","))
1,2,3,

但这行不通

scala> (1 to 3).foreach(print(_ + ","))
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.$plus(","))
              (1 to 3).foreach(print(_ + ","))

如果我删除 +"," 部分,它会再次起作用:

scala> (1 to 3).foreach(print(_ ))
123

我认为(1 to 3).foreach(print(_ + ",")) 可能会起作用,因为只有一个参数,即_。为什么 scala 抱怨这个?

【问题讨论】:

  • 因为它扩展到(1 to 3).foreach(print(x =&gt; x + ",")) 这是非法的
  • @serejja 谢谢!但是为什么(1 to 3).foreach(print(_ )) 有效?会不会扩展成(1 to 3).foreach(print(x =&gt; x )),这也是违法的?
  • 请看这个答案 stackoverflow.com/questions/1025181/hidden-features-of-scala/… 简而言之,(1 to 3).foreach(print(_ + ",")) 翻译成我上面写的东西,(1 to 3).foreach(print(_)) 翻译成 (1 to 3).foreach(x =&gt; print(x))

标签: scala lambda functional-programming


【解决方案1】:
(1 to 3).foreach(print(_ + ","))

扩展到

(1 to 3).foreach(print(x => x + ","))

与前者一样无效。

另一方面

 (1 to 3).foreach(print(_))

扩展到

 (1 to 3).foreach(x => print(x))

这是完全合法的。

简而言之,_ 扩展为显式 lambda 参数,然后将其用作 Lamba 主体中的参数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多