В чем разница между ключевыми словами `fun` и` function`? - PullRequest
34 голосов
/ 22 октября 2009

Иногда я вижу код вроде

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

Или как:

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

В чем разница между fun и function?

Ответы [ 3 ]

36 голосов
/ 22 октября 2009

Семантика для этого такая же, как в F # (вероятно, потому что F # основан на OCaml):

  • function позволяет использовать сопоставление с образцом (т. Е. |), но, следовательно, ему может быть передан только один аргумент.

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

    эквивалентно

    fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n
    
  • fun не разрешает сопоставление с образцом, но может быть передано несколько аргументов, например,

    fun x y -> x + y
    

Когда можно использовать любую из двух форм, fun обычно предпочтительнее из-за его компактности.

См. Также Документация OCaml по функциям .

21 голосов
/ 22 октября 2009

как я думаю об этом

function patterns

является сокращением для

(fun x -> match x with patterns)

где 'узоры', например,

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

fun args -> expr

так вы определяете лямбду.)

8 голосов
/ 22 октября 2009

Russ Cam верен в своем ответе.

Вот сообщение в списке OCaml, в котором говорится об этом

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

function допускает только один аргумент, но допускает сопоставление с образцом, тогда как fun является более общим и гибким способом определения функции.

Я обычно использую веселье, если нет веских причин использовать функцию.

Это можно увидеть в опубликованном вами коде, где объявление fun принимает 3 аргумента, а объявление function выполняет сопоставление с шаблоном на своем входе

...