В чем разница между ключевыми словами `fun` и` function`?

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

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?


person Nick Heiner    schedule 21.10.2009    source источник
comment
Удален тег "веселье", поскольку он имеет установленное значение, отличное от вашего намерения здесь. Я думаю, что вопрос будет лучше без него, так как некоторые люди отфильтровывают его, используя список игнорирования.   -  person Bill the Lizard    schedule 22.10.2009


Ответы (4)


Семантика для этого такая же, как в 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 по функциям.

person Russ Cam    schedule 21.10.2009
comment
Я не голосовал против, но описать «развлечение» как предпочтительное, потому что оно более компактно, - это не вся история, это даже не описание того, как его использовать, и вы никоим образом не сравниваете два ключевых слова! Функция - это то же самое, что сказать (весело x - ›сопоставить x с ...), как это будет компактнее, если вы планируете сопоставление с образцом? - person nlucaroni; 22.10.2009
comment
fun также позволяет использовать сопоставление с образцом, но только с одной альтернативой, например let - person newacct; 27.11.2011

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

function patterns

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

(fun x -> match x with patterns)

где "шаблоны", например,

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

fun args -> expr

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

person Brian    schedule 22.10.2009

Расс Кэм прав в своем ответе.

Вот запись в списке OCaml, в которой говорится об этом.

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

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

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

Вы можете увидеть это в опубликованном вами коде, где объявление fun принимает 3 аргумента, а объявление function выполняет сопоставление с образцом на его вводе.

person chollida    schedule 22.10.2009
comment
не могли бы вы также сделать let x y z = y + z, вообще без fun или function? - person Nick Heiner; 22.10.2009
comment
@Rosarch, да, конечно. Я думаю, что вопрос неявно связан с определениями анонимных функций. - person Chris Conway; 22.10.2009

fun x1 ... xn -> e

это сокращение от

function x1 -> ... -> function xn -> e
person Matthew Hannigan    schedule 22.10.2019