Иногда я вижу код типа
let (alt : recognizer -> recognizer -> recognizer) =
fun a b p -> union (a p) (b p)
Или как:
let hd = function
Cons(x,xf) -> x
| Nil -> raise Empty
В чем разница между fun
и function
?
Иногда я вижу код типа
let (alt : recognizer -> recognizer -> recognizer) =
fun a b p -> union (a p) (b p)
Или как:
let hd = function
Cons(x,xf) -> x
| Nil -> raise Empty
В чем разница между fun
и function
?
Семантика для этого такая же, как в F # (вероятно, потому, что F # основана на OCaml):
function
позволяет использовать сопоставление шаблонов (т.е. |
), но, следовательно, ему может быть передан только один аргумент.
function p_1 -> exp_1 | … | p_n -> exp_n
эквивалентно
fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n
fun
не позволяет сопоставлять шаблоны, но может быть передано несколько аргументов, например.
fun x y -> x + y
При использовании любой из двух форм fun
обычно предпочтительнее из-за его компактности.
См. также Документация OCaml для функций.
Как я об этом думаю
function patterns
является сокращением для
(fun x -> match x with patterns)
где "шаблоны", например,
| Some(x) -> yadda | None -> blah
(А
fun args -> expr
заключается в том, как вы определяете lambda.)
Russ Cam верен в своем ответе.
Вот публикация в списке OCaml о нем
function
допускает только один аргумент, но допускает сопоставление шаблонов, а fun
- более общий и гибкий способ определения функции.
Я обычно использую удовольствие, если нет веской причины использовать функцию.
Вы можете видеть это в коде, который вы отправили, где объявление fun
принимает 3 аргумента, а объявление function
выполняет сопоставление шаблонов на нем.
fun x1 ... xn -> e
- это сокращение от
function x1 -> ... -> function xn -> e