`fun`和`function`关键字有什么区别?

时间:2009-10-21 23:46:19

标签: f# ocaml

有时我会看到像

这样的代码
let (alt : recognizer -> recognizer -> recognizer) =
  fun a b p -> union  (a p) (b p)

或者喜欢:

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

funfunction之间的区别是什么?

4 个答案:

答案 0 :(得分:36)

此语义与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 documentation on Functions

答案 1 :(得分:21)

我想的方式

function patterns

的简写
(fun x -> match x with patterns)

其中'模式'就是这样。

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

(以及

fun args -> expr

是你如何定义一个lambda。)

答案 2 :(得分:8)

Russ Cam的答案是正确的。

这是在OCaml列表上发布的关于它的帖子

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

function只允许一个参数但允许模式匹配,而fun是定义函数的更通用和灵活的方法。

除非有充分理由使用功能,否则我通常会玩得很开心。

你可以在你发布的代码中看到这个,其中fun声明有3个参数,而function声明在它的输入上进行模式匹配

答案 3 :(得分:0)

fun x1 ... xn -> e

的缩写
function x1 -> ... -> function xn -> e