Qual é a diferença entre as `fun` e` palavras-chave function`?
Pergunta
Às vezes eu vejo um código como
let (alt : recognizer -> recognizer -> recognizer) =
fun a b p -> union (a p) (b p)
Ou assim:
let hd = function
Cons(x,xf) -> x
| Nil -> raise Empty
O que é a diferença entre fun
e function
?
Solução
A semântica para isso é o mesmo que no F # (provavelmente porque F # é baseado em OCaml):
-
function
permite o uso de correspondência de padrão (ou seja|
), mas, consequentemente, ele pode ser passado apenas um argumento.function p_1 -> exp_1 | … | p_n -> exp_n
é equivalente a
fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n
-
fun
não permite a correspondência de padrão, mas pode ser passado vários argumentos, por exemplo.fun x y -> x + y
Quando qualquer uma das duas formas podem ser utilizados, fun
é geralmente preferido devido à sua compacidade.
Veja também OCaml documentação sobre funções .
Outras dicas
A maneira que eu penso sobre isso
function patterns
é um atalho para
(fun x -> match x with patterns)
onde 'padrões' é por exemplo.
| Some(x) -> yadda | None -> blah
(E
fun args -> expr
é como você define um lambda.)
Russ Cam está correto em sua resposta.
Aqui está uma postagem na lista OCaml falar sobre isso
function
só permite um argumento, mas permite a correspondência de padrão, enquanto fun
é a maneira mais geral e flexível para definir uma função.
Eu geralmente uso diversão a menos que haja uma boa razão para função de uso.
Você pode ver isso no código que você postou em que a declaração fun
leva 3 argumentos e a declaração function
faz correspondência de padrão, por si de entrada