Scala高阶函数调用语法令人困惑

4

我对scala中'block' {...}的各种用法有些困惑,特别是在调用高阶函数时,例如以下示例。

def higherOrder(func: Int => Int): Int = {
  func(4)
}

val f = ((x: Int) => x*x)

然后我可以这样调用higherOrder:
  1. higherOrder(f),或者

  2. higherOrder {f},或者

  3. higherOrder { x => x*x }

(1) 很明显, 但是我无法理解编译器如何解析(2)和(3)的语法。 有人能解释一下(2)和(3)在语言规范方面对应什么吗?

2
重复问题:http://stackoverflow.com/q/17160145/1296806 或 https://dev59.com/b2Mm5IYBdhLWcg3wZ-XQ 或 https://dev59.com/RWYr5IYBdhLWcg3wM3j6 或其他。从这些重复问题链接到其他重复问题。 :) - som-snytt
简短回答:param块可以只是一个块。一个{块}会计算出它的最后一条语句。 - som-snytt
好的,谢谢指点。我认为所有那些花里胡哨的语法对语言的负面影响大于正面影响。应该有一种明显的方法来完成一件事情,就像在 Python 之中所强调的“Python 之禅”一样。 - Imaxd
1个回答

4
请参见SLS 6.6 函数应用。函数应用的定义如下:
SimpleExpr ::= SimpleExpr1 ArgumentExprs
ArgumentExprs ::= ‘(’ [Exprs] ‘)’
                ...
                | [nl] BlockExpr

BlockExpr

BlockExpr ::= ‘{’ CaseClauses ‘}’
            | ‘{’ Block ‘}’

因此,在函数或方法名称之后,您可以在括号中指定参数列表或在大括号中指定表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接