Иногда я вижу код вроде
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 по функциям.
fun
также позволяет использовать сопоставление с образцом, но только с одной альтернативой, например let
- person newacct; 27.11.2011
Как я об этом думаю
function patterns
сокращение для
(fun x -> match x with patterns)
где "шаблоны", например,
| Some(x) -> yadda | None -> blah
(И
fun args -> expr
вот как вы определяете лямбду.)
Расс Кэм прав в своем ответе.
Вот запись в списке OCaml, в которой говорится об этом.
function
допускает только один аргумент, но допускает сопоставление с образцом, а fun
- более общий и гибкий способ определения функции.
Обычно я использую развлечение, если нет веской причины использовать функцию.
Вы можете увидеть это в опубликованном вами коде, где объявление fun
принимает 3 аргумента, а объявление function
выполняет сопоставление с образцом на его вводе.
let x y z = y + z
, вообще без fun
или function
?
- person Nick Heiner; 22.10.2009
fun x1 ... xn -> e
это сокращение от
function x1 -> ... -> function xn -> e