23.2 Function declarations : valRecDecl, funDecl
Syntax of function declarations has the following two forms valRecDecl and 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 |
These declarations define mutual recursive functions. The scope of the function names being defined is the entire declaration and the declarations that follow.
val declarations of valBind in valRecDecl are restricted to those that have the following syntactic form:
vid = fn expression
The identifiers (function names) vid appearing in the same funBind1 must be the same, and function names appearing in different funBind1s must be pair-wise distinct. As in valBind1, variables contained in patterns pat in the same funBind1 must be pair-wise distinct.
In evaluation of these declarations, function names (vid) are bound to the same (static and dynamic) values as the corresponding functions.
The type variable declaration tyvarSeq in valBind and funDecl delimit their scope. These type variables must be generalized at the top-level of each valBind1 of valBind and funBind1.
23.2.1 Function declaration interface
Function declaration interface is the same as val declaration interface. Each function name defined in the function declaration and its type are specified in the same syntax of val declaration specification. The following is an example of a source file and an interface file containing function declarations.
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 |