2009-10-21 4 views
31

A volte vedo il codice comeQual è la differenza tra le parole chiave `fun` e` function`?

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

O come:

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

Qual è la differenza tra fun e function?

+2

Rimosso il tag "divertente", poiché ha un significato stabilito diverso dal tuo intento qui. Penso che la domanda sarà meglio senza di essa, dal momento che alcune persone lo filtrano usando la lista di ignorare. –

risposta

36

La semantica di questo è lo stesso come in F # (probabilmente perché F # si riferiscono al OCaml):

  • function consente l'utilizzo di pattern matching (cioè |), ma di conseguenza possono essere passati solo un argomento.

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

    è equivalente a

    fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n 
    
  • fun non consente pattern matching, ma possono essere passati più argomenti, ad esempio

    fun x y -> x + y 
    

Quando una delle due forme possono essere utilizzati, fun è generalmente preferito a causa della sua compattezza.

Vedere anche OCaml documentation on Functions.

+5

Non ho fatto un downvote, ma, descrivendo il 'divertimento' come preferito perché è più compatto non è l'intera storia, non è nemmeno una descrizione di come usarlo, e in nessun modo stai confrontando le due parole chiave! la funzione è la stessa cosa che dice, (divertimento x -> match x con ...), come è più compatto se si intende abbinare il pattern? – nlucaroni

+0

Si aggiornerà con maggiori dettagli ora. –

+0

La mia risposta che ha fatto riferimento al tuo è stata anche downvoted. – chollida

8

Russ Cam è corretto nella sua risposta.

Ecco un post sulla lista OCaml parlarne

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

function consente solo per un argomento, ma permette l'adattamento del modello, mentre fun è il modo più generale e flessibile per definire una funzione.

Generalmente utilizzo il divertimento a meno che non vi sia una buona ragione per utilizzare la funzione.

Potete vedere questo nel codice che avete inviato in cui la dichiarazione fun prende 3 argomenti e la dichiarazione function fa pattern matching su di essa l'ingresso

+0

non potresti fare anche 'lasciare x y z = y + z', senza' fun' o 'function'? –

+0

@Rosarch, sì, certo. Penso che la domanda sia implicita sulle definizioni di funzioni anonime. –

+0

@Rosarch, certamente :) – chollida

19

Il modo in cui ci penso

function patterns 

è una scorciatoia per

(fun x -> match x with patterns) 

dove "pattern" è ad esempio

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

(E

fun args -> expr 

è come si definisce una lambda.)