語法: Dcl ::= ?def? FunDcl FunDcl ::= FunSig : Type Def ::= ?def? FunDef FunDef ::= FunSig [?:? Type] ?=? Expr FunSig ::= id [FunTypeParamClause] ParamClauses FunTypeParamClause ::= ?[? TypeParam {?,? TypeParam} ?]? ParamClauses ::= {ParamClauses} [[nl] ?(? ?implicit? Params ?)?] ParamClause ::= [nl] ?(? [Params] ?)?} Params ::= Param {?,? Param} Param ::= {Annotation} id [?:? ParamType] ParamType ::= Type | ?=>? Type | Type ?*? 函數聲明具有這樣的情勢:def f psig: T,f是函數的名稱,psig是參數簽名,T是返回類型。函數定義def f psig: T = e還包括了函數體e,例如1個表達式定義了函數的結果。參數簽名由1個可選的類型參數子句[tps],后跟零個或多個值參數子句(ps1)…(psn)構成。這樣的聲明或定義引入了1個值,該值具有1個(多是多態的)方法類型,其參數類型與返回類型已給出。 已給出的函數體的類型被期望與函數聲明的返回類型1致。如果函數定義不是遞歸的,那末返回類型則可省略,由于其可由函數體打包的類型推斷出來。 類型參數子句tps由1個或多個類型聲明構成,在其中引入了可能具有邊界的類型參數。類型參數的域包括全部簽名,也包括任何類型參數邊界和函數體(如果有的話)。 值參數子句ps由零個或多個規范類型綁定(如x: T)構成,這些類型綁定綁定了值參數和將它們與它們的類型聯系起來。1個規范值參數命名x的范圍是函數體(如果有的話)。所有的類型參數名及值參數名必須兩兩不同。 |