【发布时间】:2012-04-28 16:02:55
【问题描述】:
上下文非常简单。我的假设基于 Odersky 的书“Scala 编程,第 2 版”,第 8.5 节描述了“占位符语法”。
我有一个 List[List[Boolean]](即矩形位图),我试图在其中计算值“true”的总出现次数。这是定义执行良好的数据的 REPL 行:
val rowsByColumns =
List( List(false, true, false)
, List(true, true, true)
, List(false, true, false)
)
接下来,我尝试使用以下行计算“true”的出现次数。而不是执行,我收到一个错误:
val marks = (for(row <- rowsByColumns)
yield {row.foldLeft[Int](0)(_ + (if (_) 1 else 0))}).sum
<console>:8: error: wrong number of parameters; expected = 2
val marks = (for(row <- rowsByColumns) yield {row.foldLeft[Int](0)(_ + (i
f (_) 1 else 0))}).sum
^
我不明白这个错误,因为我有两个下划线代表函数的参数。所以,我写了这个执行得很好,使函数更加明确:
val marks = (for(row <- rowsByColumns)
yield {row.foldLeft[Int](0)((sum, marked) => sum + (if (marked) 1 else 0))}
).sum
我的问题是:为什么在不太明确的情况下我收到并出错,但是当我通过减少“简化”来绘制函数时,它会正确执行?
感谢您对此提供的任何见解。
【问题讨论】:
-
进一步考虑这一点,Odersky 的提议(在某些 SIP 中)是否有可能改变 Scala 的语法以取消 if 评估表达式中所需的括号,从而纠正他的“缺陷”,使得通过从 if 中删除括号重新实现原始错误语句会使其正常工作吗?
-
这是我所指的文档(SIP-12 Uncluttering Scala Syntax - Part 1: if):docs.scala-lang.org/sips/pending/uncluttering-control.html
-
这两个语言设计问题(条件的括号和占位符语法的限制)是正交的——括号和下划线绑定之间的关系只是一个经验法则,你可以从像@这样的例子中看到987654325@,其中括号不绑定下划线。
标签: scala