2009-10-21 21 views
31

A veces veo un código como¿Cuál es la diferencia entre las palabras clave `fun` y` function`?

let (alt : recognizer -> recognizer -> recognizer) = 
    fun a b p -> union (a p) (b p) 

O como:

let hd = function 
    Cons(x,xf) -> x 
    | Nil -> raise Empty 

¿Cuál es la diferencia entre fun y function?

+2

Se ha eliminado la etiqueta 'fun', ya que aquí tiene un significado establecido diferente a su intención. Creo que la pregunta estará mejor sin ella, ya que algunas personas la filtran usando la lista de ignorar. –

Respuesta

36

La semántica para esto es la misma que en F # (probablemente porque F # se basa en OCaml):

  • function permite el uso de patrón de coincidencia (es decir |), pero en consecuencia, se puede pasar solamente un argumento

    function p_1 -> exp_1 | … | p_n -> exp_n 
    

    es equivalente a

    fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n 
    
  • fun no permite la coincidencia de patrones, pero se puede pasar múltiples argumentos, por ejemplo

    fun x y -> x + y 
    

Cuando cualquiera de las dos formas se pueden utilizar, fun Generalmente se prefiere debido a su compacidad.

Véase también OCaml documentation on Functions.

+5

No he votado negativamente, pero describir la "diversión" como preferida porque es más compacta no es toda la historia, ¡ni siquiera es una descripción de cómo usarla, y de ninguna manera está comparando las dos palabras clave! función es lo mismo que decir, (diversión x -> unir x con ...), ¿cómo es eso más compacto si planeas emparejar patrones? – nlucaroni

+0

Se actualizará con más detalles ahora. –

+0

Mi respuesta que hizo referencia a la de usted también fue desestimada. – chollida

8

Russ Cam tiene razón en su respuesta.

Aquí es una publicación en la lista OCaml hablar de ello

http://caml.inria.fr/pub/ml-archives/ocaml-beginners/2003/11/b8036b7a0c1d082111d7a83c8f6dbfbb.en.html

function sólo permite un argumento, pero permite la coincidencia de patrones, mientras que fun es la forma más general y flexible para definir una función.

Generalmente uso la diversión a menos que haya una buena razón para usar la función.

Esto se puede ver en el código que envió cuando la declaración fun toma 3 argumentos y la declaración function hace coincidencia de patrones en él de entrada

+0

, ¿no podría hacer 'let x y z = y + z', sin' fun' o 'function'? –

+0

@Rosarch, sí, por supuesto. Creo que la pregunta es implícita sobre las definiciones de funciones anónimas. –

+0

@Rosarch, sin duda :) – chollida

19

La forma en que pienso en ello

function patterns 

es la abreviatura de

(fun x -> match x with patterns) 

donde es 'patrones' por ejemplo,

| Some(x) -> yadda | None -> blah 

(Y

fun args -> expr 

es como se define una lambda.)

Cuestiones relacionadas