Definițiile let f x = x + 3 și let f = fun x -> x + 3 sunt echivalente (prima e mai scurtă și cu sintaxă mai familiară).
ML are, strict vorbind, doar funcții cu un singur parametru, ceea ce e suficient. O funcție "cu mai mulți parametri" let add x y = x + y e de fapt doar o scriere simplificată pentru let add = fun x -> fun y -> x + y . S-a definit de fapt o funcție care, aplicată primului parametru x returnează o funcție, care aplicată încă unui parametru y produce suma. Putem deci aplica parțial o funcție la mai puțini parametri decât cei din definiție, și obținem o funcție (care se poate apoi aplica mai departe).
let add3 = add 3 (* adica fun y -> 3 + y *) add3 2 (* rezultă 3 + 2 = 5 *)Aplicarea funcției (apelul de funcție) e asociativ la stânga, deci add 2 3 înseamnă (add 2) 3, consistent cu cele explicate mai sus: se evaluează add 2, care returnează o funcție, care e apoi aplicată lui 3.
Notația obișnuită din matematică f (x, y) = x + y produce în ML altceva, o funcție cu un singur parametru, care e o pereche (în notația uzuală cu paranteze și virgulă). Funcția add de mai sus are tipul int -> int -> int (funcție de întreg care returnează int -> int, adică o funcție de între, iar funcția f are tipul int * int -> int: e definită pe produsul cartezian int * int (perechi de întregi) cu valori întregi.
match expresie0 with | tipar1 -> rezultat1 | tipar2 -> rezultat2 ...Aceasta e o expresie care, în funcție de valoarea lui expresie0 are unul din rezultatele indicate; acestea trebuie să fie de același tip. Una din cele mai frecvente erori este de a încerca să dăm rezultate de tipuri diferite. Compilatorul va raporta eroarea: This expression has type tip2 but an expression was expected of type tip1
Ilustrăm potrivirea prin tipare în câteva funcții simple (cum toate calculele în ML se fac în funcții). Cea mai simplă potrivire de tipare se face pe constante:
let not b = match b with | false -> true | true -> falseAm definit astfel negația booleană, o funcție bool -> bool . Dealtfel, not este un operator predefinit în ML.
let not = function | false -> true | true -> falseCuvântul cheie function definește o funcție, dar argumentul ei nu este numit (spre deosebire de fun x -> ... ), ci e identificat prin tiparele care urmează. Citim: not e o funcție care dacă ia argumentul false returnează true, etc.
Fiecare parte din tiparul potrivit primește (e legată de) un nume care poate fi folosit ulterior în expresia rezultatului.
Potrivirea de tipare se face după structura valorii (constantă, sau compusă din elemente: pereche, listă, etc.); nu în funcție de o relație pe acea valoare. Nu putem scrie deci
let sign = function
| n > 0 -> 1
dar putem scrie
let sign = function | 0 -> 0 (* tipar cu valoare constanta *) | n -> if n > 0 then 1 else -1Fiecare nume poate aparărea o singură dată în tipar: nu putem identifica o listă cu primele două elemente egale cu:
| e1 :: e2 :: t when e1 = e2 -> rezultat1 | e1 :: e2 :: t -> rezultat2Cum tiparele se evaluează în ordine, al doilea tipar, deși nu are nicio condiție suplimentară, se va potrivi doar pentru elemente diferite (adică atunci când nu s-a potrivit tiparul 1).
Desigur se poate folosi și testul în expresia rezultat:
| e1 :: e2 :: t -> if e1 = e2 then ... else ...Putem indica prin tipare și structura parametrilor unei funcții, ca în exemplul următor, unde tiparul spune că argumentul funcției e o pereche. Funcția returnează o pereche cu elementele în ordine inversă (interschimbate):
let swap (x, y) = (y, x)