resueltos funcion ejemplos contar buscarv buscar syntax f#

syntax - ejemplos - funcion buscarv en excel



F#concordancia explícita vs sintaxis de función (8)

Perdón por el título vago, pero parte de esta pregunta es a qué 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?


El pro para la segunda sintaxis es que cuando se usa en una lambda, podría ser un poco más escueto 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]


Esta es una vieja pregunta, pero arrojaré mi $ 0.02.

En general, me gusta más la versión del match ya que vengo del mundo de Python donde "explícito es mejor que implícito".

Por supuesto, si se necesita información de tipo sobre el parámetro, la versión de la function no puede ser utilizada.

OTOH Me gusta el argumento de Stringer así que comenzaré a usar la function en lambdas simples.


Hacen lo mismo en su caso: la palabra clave de function actúa como una combinación de la palabra clave fun (para producir una lambda anónima) seguida de la palabra clave de match .

Entonces, técnicamente estos dos son iguales, con la adición de una fun :

let foo1 = fun x -> match x with | 1 -> "one" | _ -> "not one" let foo2 = function | 1 -> "one" | _ -> "not one"


La versión de coincidencia se denomina "expresión de coincidencia de patrón". La versión de la función se denomina "función de coincidencia de patrones". Se encuentra en la sección 6.6.4 de la spec .

Usar uno sobre el otro es una cuestión de estilo. Prefiero solo usar la versión de función cuando necesito definir una función que es solo una declaración de coincidencia.


La versión de función es una mano corta para la sintaxis de coincidencia completa en el caso especial donde la declaración de coincidencia es toda la función y la función solo tiene un único argumento (las tuplas cuentan como una). Si desea tener dos argumentos, debe usar la sintaxis de coincidencia completa *. Puedes 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 por separado, mientras que la versión de la función toma un único argumento acumulado. 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 la firma de tipo correcta, pero se ve bastante fea en mi opinión, 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 ??"


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.


Solo para completar, acabo de llegar a la página 321 de Expert FSharp :

"Nota, el listado 12-2 usa la expresión function pattern-rules -> expression . Esto es equivalente a (fun x -> match x with pattern-rules -> expression) y es especialmente conveniente como una forma de definir funciones trabajando directamente sobre sindicatos discriminados ".