2013-08-04 81 views
4

我對scala中'block'{...}構造的各種用法有點困惑,尤其是在調用如下例所示的高階函數時。令人困惑的Scala高階函數調用語法

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

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

然後我可以叫高階像這樣:

  1. higherOrder(f),或

  2. higherOrder {f},或者

  3. higherOrder { x => x*x }

(1)很明顯, 但我無法圍繞編譯器解析(2)和(3)的語法如何解釋 有人可以解釋(2)和(3)對應的關於到language specification?

+2

Duplicates http://stackoverflow.com/q/17160145/1296806或http://stackoverflow.com/q/17639922/1296806或http://stackoverflow.com/q/13872196/1296806或其他。從這些模糊鏈接到其他模糊。 :) –

+0

簡短回答:參數塊可以只是一個塊。 {block}向最後一個陳述進行迴應。 –

+0

好的感謝指針我認爲所有那些花哨的語法對語言的傷害比好的多。應該有一種顯而易見的方式來完成像Python中的(禪)那樣的給定事物 – Imaxd

回答

4

請參閱SLS6.6功能應用。功能應用的定義是這樣的:

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

而且BlockExpr

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

所以經過函數或方法的名稱,你可以指定在大括號括號或表達任何參數列表。