Why does this wildcarded function tells me it has

2020-03-27 06:03发布

问题:

The offending code was:

<console>:47: error: wrong number of parameters; expected = 2
            terms.foldLeft(r.unitA)(r.add(_, _.eval(x)))

I solved my problem by writing:

 terms.foldLeft(r.unitA)((a,b) => r.add(a, b.eval(x)))

But I'd still like to know what prevented my initial attempt?

回答1:

From what I've read on this type of issue, when you use "_" as a place holder for an anonymous parameter of a function, the scope of that function is the innermost parenthesis containing it. So when you wrapped your two placeholders with r.add(), the scope of the params is lost. Check out this link and see if it helps explain the rules better.

http://www.scala-lang.org/node/2916



回答2:

Here is the section of the SLS 6.23:

http://iainmcgin.github.io/scala-ref-markdown/#placeholder-syntax-for-anonymous-functions

Updated link:

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#placeholder-syntax-for-anonymous-functions

Daniel Sobral's post says:

"When you use "_" as a place holder for an anonymous parameter of a function, the scope of that function is the innermost parenthesis containing it. Most of the time.

Updated spin: I think the syntax explanation from the spec is easier to get, that the placeholder doesn't escape an enclosing Expr. There are various duplicate questions.