Sorry about the vague title, but part of this question is what these two syntax styles are called:
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
The other part is what difference there is between the two, and when I would want to use one or the other?
This is an old question but I will throw my $0.02.
In general I like better the
match
version since I come from the Python world where "explicit is better than implicit."Of course if type information on the parameter is needed the
function
version cannot be used.OTOH I like the argument made by
Stringer
so I will start to usefunction
in simple lambdas.The function version is a short hand for the full match syntax in the special case where the match statement is the entire function and the function only has a single argument (tuples count as one). If you want to have two arguments then you need to use the full match syntax*. You can see this in the types of the following two functions.
As you can see match version takes two separate arguments whereas the function version takes a single tupled argument. I use the function version for most single argument functions since I find the function syntax looks cleaner.
*If you really wanted to you can get the function version to have the right type signature but it looks pretty ugly in my opinion - see example below.
Just for completeness sake, I just got to page 321 of Expert FSharp:
The pro for the second syntax is that when used in a lambda, it could be a bit more terse and readable.
vs
They do the same thing in your case -- the
function
keyword acts like a combination of thefun
keyword (to produce an anonymous lambda) followed by thematch
keyword.So technically these two are the same, with the addition of a
fun
:The match version is called a "pattern matching expression". The function version is called a "pattern matching function". Found in section 6.6.4 of the spec.
Using one over the other is a matter of style. I prefer only using the function version when I need to define a function that is only a match statement.