プログラミング言語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,n1)
| (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