プログラミング言語SML#解説 3.7.1版
23.2 関数宣言 : valRecDecl, funDecl
関数宣言の構文には以下のvalRecDecl及び funDeclがある.
valRecDecl | ::= | val rec tyvarSeq valBind | |
funDecl | ::= | fun tyvarSeq funBind | |
funBind | ::= | funBind1 | |
funBind1 and funBind | |||
funBind1 | ::= | op vid atpat atpat : ty = exp | () |
| op vid atpat atpat : ty = exp | |||
| | |||
| op vid atpat atpat : ty = exp |
この宣言で,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 |