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)が何に対応するかを誰かが説明できますか?

4

1 に答える 1

4

SLS 6.6 関数アプリケーションを参照してください。関数適用は次のように定義されます。

SimpleExpr ::= SimpleExpr1 ArgumentExprs
ArgumentExprs ::= ‘(’ [Exprs] ‘)’
                ...
                | [nl] BlockExpr

そしてBlockExpr

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

したがって、関数またはメソッド名の後に、括弧内の引数リストまたは括弧内の式のいずれかを指定できます。

于 2013-08-05T05:31:24.640 に答える