Ключевое слово function
представляет собой вариант fun
, который учитывает, что поведение функции часто напрямую зависит от значения аргумента. Например, если мы начнем со следующего определения факториальной функции:
For a positive integer n, n! is 1 if n = 0, and n * (n-1)! otherwise
тогда естественный перевод на OCaml
let factorial = function
| 0 (* if n = 0 *) -> 1
| n (* otherwise *) -> n * factorial (n-1)
как вы сказали это строго эквивалентно
let factorial = fun n -> match n with
| 0 (* if n = 0 *) -> 1
| n (* otherwise *) -> n * factorial (n-1)
но когда аргумент функции немедленно деконструируется при сопоставлении с образцом, может быть более читабельным использовать function
напрямую.
Что касается '0'..'9'
, то это шаблон диапазона, который соответствует всем символам (т. Е. '0'|'1'|'2'|'3'|'4'|..| '9'
между нижней и верхней границами (включенными) диапазона (в соответствии с порядком символов ascii)
let is_digit = function '0'..'9' -> true | _ -> false
is_digit '0' (* returns true *);;
is_digit 'a' (* returns false *);;