Qual è la differenza tra le parole chiave `fun` e` function`?
Domanda
A volte vedo codice come
let (alt : recognizer -> recognizer -> recognizer) =
fun a b p -> union (a p) (b p)
O come:
let hd = function
Cons(x,xf) -> x
| Nil -> raise Empty
Qual è la differenza tra fun
e function
?
Soluzione
La semantica per questo è la stessa di F # (probabilmente perché F # è basato su OCaml):
function
consente l'uso di pattern matching (cioè|
), ma di conseguenza può essere passato solo un argomento.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
non consente la corrispondenza dei pattern, ma può essere passato più argomenti, ad esempiofun x y -> x + y
Quando è possibile utilizzare una delle due forme, divertimento
è generalmente preferito per la sua compattezza.
Vedi anche Documentazione OCaml sulle funzioni .
Altri suggerimenti
Il modo in cui ci penso
function patterns
è una scorciatoia per
(fun x -> match x with patterns)
dove 'pattern' è ad esempio
| Some(x) -> yadda | None -> blah
(E
fun args -> expr
è il modo in cui definisci una lambda.)
Russ Cam ha ragione nella sua risposta.
Ecco un post sull'elenco OCaml che ne parla
function
consente solo un argomento ma consente la corrispondenza dei pattern, mentre fun
è il modo più generale e flessibile per definire una funzione.
In genere uso il divertimento a meno che non ci sia una buona ragione per usare la funzione.
Puoi vederlo nel codice che hai pubblicato in cui la dichiarazione fun
accetta 3 argomenti e la dichiarazione function
fa corrispondere lo schema al suo input