What is the difference between the `fun` and `function` keywords?
Solution 1
The semantics for this is the same as in F# (probably because F# is based on OCaml):
-
function
allows the use of pattern matching (i.e.|
), but consequently it can be passed only one argument.function p_1 -> exp_1 | … | p_n -> exp_n
is equivalent to
fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n
-
fun
does not allow pattern matching, but can be passed multiple arguments, e.g.fun x y -> x + y
When either of the two forms can be used, fun
is generally preferred due to its compactness.
See also OCaml documentation on Functions.
Solution 2
The way I think about it
function patterns
is shorthand for
(fun x -> match x with patterns)
where 'patterns' is e.g.
| Some(x) -> yadda | None -> blah
(And
fun args -> expr
is how you define a lambda.)
Solution 3
Russ Cam is correct in his answer.
Here is a posting on the OCaml list talking about it
function
only allows for one argument but allows for pattern matching, while fun
is the more general and flexible way to define a function.
I generally use fun unless there is a good reason to use function.
You can see this in the code you posted where the fun
declaration takes 3 arguments and the function
declaration does pattern matching on it's input
Solution 4
fun x1 ... xn -> e
is an abbreviation for
function x1 -> ... -> function xn -> e
Nick Heiner
JS enthusiast by day, horse mask enthusiast by night. Talks I've Done
Updated on July 09, 2022Comments
-
Nick Heiner almost 2 years
Sometimes I see code like
let (alt : recognizer -> recognizer -> recognizer) = fun a b p -> union (a p) (b p)
Or like:
let hd = function Cons(x,xf) -> x | Nil -> raise Empty
What is the difference between
fun
andfunction
?-
Bill the Lizard over 14 yearsRemoved the 'fun' tag, since it has an established meaning other than your intent here. I think the question will be better off without it, since some people filter it out using the ignore list.
-
-
Nick Heiner over 14 yearscouldn't you also do
let x y z = y + z
, with nofun
orfunction
at all? -
Chris Conway over 14 years@Rosarch, yes, of course. I think the question is implicitly about anonymous function definitions.
-
nlucaroni over 14 yearsI didn't downvote, but, describing 'fun' as preferred because it's more compact isn't the whole story, it isn't even a description of how to use it, and in no way are you comparing the two keywords! function is the same as saying, (fun x -> match x with ...), how is that more compact if you plan to pattern match?
-
newacct over 12 years
fun
also allows the use of pattern matching, but with only one alternative, likelet