2009-10-21 7 views
31

Czasem widzę kod jakJaka jest różnica między słowami kluczowymi "zabawa" i "funkcja"?

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

albo jak:

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

Jaka jest różnica między fun i function?

+2

Usunięto tag "zabawny", ponieważ ma on inne znaczenie niż tutaj. Myślę, że bez niego lepiej będzie, jeśli to pytanie zostanie odfiltrowane za pomocą listy ignorowanych. –

Odpowiedz

36

semantyki dla tego jest taka sama jak w F # (prawdopodobnie dlatego, że F # jest oparty na SML):

  • function umożliwia stosowanie Pattern Matching (tj |), ale w związku z tym mogą być przekazywane tylko jeden argument.

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

    odpowiada

    fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n 
    
  • fun nie pozwala na dopasowanie wzorca, lecz mogą być przekazane, na przykład wiele argumentów

    fun x y -> x + y 
    

, gdy jeden z dwóch postaciach można stosować fun jest zazwyczaj korzystne ze względu na swoją zwartość.

Zobacz także OCaml documentation on Functions.

+5

Nie spadłem, ale opisywanie "zabawy" jako preferowanej, ponieważ jest bardziej zwarte, nie jest całą historią, nie jest nawet opisem tego, jak jej używać, i w żaden sposób nie porównasz tych dwóch słów kluczowych! funkcja jest taka sama, jak mówienie (fun x -> match x with ...), jak to jest bardziej kompaktowe, jeśli planujesz dopasować wzór? – nlucaroni

+0

Zostanie zaktualizowany z większą ilością szczegółów. –

+0

Moja odpowiedź odnosząca się do Twojej również została odrzucona. – chollida

8

Russ Cam ma poprawną odpowiedź.

Oto wpis na liście OCaml mówisz to

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

function pozwala tylko na jeden argument, ale pozwala na dopasowywanie wzorca, natomiast fun jest bardziej ogólny i elastyczny sposób zdefiniować funkcję.

Generalnie używam zabawy, chyba że istnieje dobry powód, aby korzystać z funkcji.

Można to zobaczyć w kodzie zamieszczonych w którym zgłoszenie fun trwa 3 argumenty i deklaracja function robi wzór pasujący na jego wejście

+0

, czy nie można również pozwolić na "let xy z = y + z", bez "fun" czy "funkcji" w ogóle? –

+0

@Rosarch, tak, oczywiście. Myślę, że pytanie dotyczy wyłącznie anonimowych definicji funkcji. –

+0

@Rosarch, z pewnością :) – chollida

19

ten sposób myślę o tym

function patterns 

jest skrótem

(fun x -> match x with patterns) 

gdzie "wzorce" to np.

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

(I

fun args -> expr 

sposób można zdefiniować lambda.)

Powiązane problemy