プログラミング言語SML#解説 3.7.1版
23 核言語の宣言とインターフェイス

23.2 関数宣言 : ⟨valRecDecl⟩, ⟨funDecl⟩

関数宣言の構文には以下の⟨valRecDecl⟩及び ⟨funDecl⟩がある.

⟨valRecDecl⟩ ::= val rec ⟨tyvarSeq⟩ ⟨valBind⟩
⟨funDecl⟩ ::= fun ⟨tyvarSeq⟩ ⟨funBind⟩
⟨funBind⟩ ::= ⟨funBind1⟩
 | ⟨funBind1⟩ and ⟨funBind⟩
⟨funBind1⟩ ::=   (op)? ⟨vid⟩ ⟨atpat11⟩ ⋯ ⟨atpat1n⟩ (: ⟨ty⟩)? = ⟨exp1⟩ (m,n≥1)
| (op)? ⟨vid⟩ ⟨atpat21⟩ ⋯ ⟨atpat2n⟩ (: ⟨ty⟩)? = ⟨exp2⟩
| ⋯
| (op)? ⟨vid⟩ ⟨atpatm1⟩ ⋯ ⟨atpatmn⟩ (: ⟨ty⟩)? = ⟨expm⟩

この宣言で,andで接続された複数の関数が相互再帰的に定義さ れる. 定義される関数名の有効範囲は,この宣言全体と,この宣言に続く部分 である.

⟨valRecDecl⟩における⟨valBind⟩のval宣言は,

⟨vid⟩ = fn 式

の形に制限される.

同一の⟨funBind1⟩に現れる識別子(関数名)⟨vid⟩は すべて同一でなければならず,異なる⟨funBind1⟩に現れる 関数名⟨vid⟩は互いに異ならなければならない. また,同一の⟨funBind1⟩に現れる⟨pat⟩に含まれる変 数はすべて異なっていなければならない.

さらにこの宣言の評価においては,関数名⟨vid⟩が,定義される関数と 同一の値(静的型および動的な値)をもつ変数と定義される.

⟨tyvarSeq⟩は,⟨valBind⟩および⟨funDecl⟩に 現れる型変数のスコープの指定である. これら型変数は,各⟨funBind1⟩および⟨valBind⟩の中 の各⟨valBind1⟩のトップレベルで型抽象される.

23.2.1 関数宣言インターフェイス

関数宣言のインターフェイスは,val宣言のインターフェイスと同一である. 関数宣言で定義される関数名と型をval宣言のインターフェイスと同一の構文で 記述する. 以下は,関数宣言に対するソースファイルとインターフェイスの例である.

Bool.sml file: fun not true = false
  | not false = true
fun toString true = "true"
  | toString false = "false"
Bool.smi file: val not : bool -> bool
val toString : bool -> string