Lo siento por el título vago, pero parte de esta pregunta es cómo se llaman estos dos estilos de sintaxis:
let foo1 x =
match x with
| 1 -> "one"
| _ -> "not one"
let foo2 = function
| 1 -> "one"
| _ -> "not one"
La otra parte es ¿qué diferencia hay entre los dos y cuándo querría usar uno u otro?
La ventaja de la segunda sintaxis es que cuando se usa en una lambda, podría ser un poco más concisa y legible.
List.map (fun x -> match x with | 1 -> "one" | _ -> "not one") [0;1;2;3;1]
vs
List.map (function 1 -> "one" | _ -> "not one") [0;1;2;3;1]
fuente
La versión de la función es una forma abreviada de la sintaxis de coincidencia completa en el caso especial en el que la declaración de coincidencia es la función completa y la función solo tiene un único argumento (las tuplas cuentan como uno). Si desea tener dos argumentos, debe usar la sintaxis de coincidencia completa *. Puede ver esto en los tipos de las siguientes dos funciones.
//val match_test : string -> string -> string let match_test x y = match x, y with | "A", _ -> "Hello A" | _, "B" -> "Hello B" | _ -> "Hello ??" //val function_test : string * string -> string let function_test = function | "A", _ -> "Hello A" | _, "B" -> "Hello B" | _ -> "Hello ??"
Como puede ver, la versión de coincidencia toma dos argumentos separados, mientras que la versión de la función toma un solo argumento tuplado. Utilizo la versión de la función para la mayoría de las funciones de un solo argumento ya que encuentro que la sintaxis de la función parece más limpia.
* Si realmente lo desea, puede obtener la versión de la función para que tenga el tipo de firma correcto, pero en mi opinión se ve bastante feo; vea el ejemplo a continuación.
//val function_match_equivalent : string -> string -> string let function_match_equivalent x y = (x, y) |> function | "A", _ -> "Hello A" | _, "B" -> "Hello B" | _ -> "Hello ??"
fuente
Hacen lo mismo en su caso: la
function
palabra clave actúa como una combinación de lafun
palabra clave (para producir una lambda anónima) seguida de lamatch
palabra clave.Entonces, técnicamente, estos dos son iguales, con la adición de un
fun
:let foo1 = fun x -> match x with | 1 -> "one" | _ -> "not one" let foo2 = function | 1 -> "one" | _ -> "not one"
fuente
fun
es decir, técnicamente se define en términos defunction | _ -> ...
?fun x y -> ...
seríafun x -> fun y -> ...
, y luegofun x -> ...
seríafunction | x -> ...
. Es por eso que puede hacer coincidir patrones enfun
, por ejemplofun (x::xs) -> ...
.En aras de la integridad, acabo de llegar a la página 321 de Expert FSharp :
fuente
La función solo permite un argumento pero permite la coincidencia de patrones, mientras que la diversión es la forma más general y flexible de definir una función. Eche un vistazo aquí: http://caml.inria.fr/pub/docs/manual-ocaml/expr.html
fuente
Las dos sintaxis son equivalentes. La mayoría de los programadores eligen uno u otro y luego lo usan de manera consistente.
La primera sintaxis permanece más legible cuando la función acepta varios argumentos antes de comenzar a trabajar.
fuente
Esta es una vieja pregunta, pero arrojaré mis $ 0.02.
En general me gusta más la
match
versión ya que vengo del mundo Python donde "explícito es mejor que implícito".Por supuesto, si se necesita información de tipo en el parámetro,
function
no se puede utilizar la versión.OTOH Me gusta el argumento de,
Stringer
así que comenzaré a usarlofunction
en lambdas simples.fuente