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

Nic*_*ner 36 f# ocaml

有时我会看到类似的代码

let (alt : recognizer -> recognizer -> recognizer) =
  fun a b p -> union  (a p) (b p)
Run Code Online (Sandbox Code Playgroud)

或者像:

let hd = function
    Cons(x,xf) -> x
  | Nil -> raise Empty
Run Code Online (Sandbox Code Playgroud)

fun和之间有什么区别function

Rus*_*Cam 38

其语义与F#中的相同(可能是因为F#基于OCaml):

当可以使用两种形式中的任何一种时,fun由于其紧凑性,通常是优选的.

另请参见有关函数的OCaml文档.

  • 我没有downvote,但是,将'fun'描述为首选,因为它更紧凑并不是整个故事,它甚至不是如何使用它的描述,也绝不是你比较两个关键字!功能与说法相同,(有趣的x - >匹配x与...),如果你计划模式匹配,那么它会更紧凑吗? (5认同)
  • `fun`也允许使用模式匹配,但只有一个替代,比如`let` (5认同)

Bri*_*ian 21

我想的方式

function patterns
Run Code Online (Sandbox Code Playgroud)

是简写

(fun x -> match x with patterns)
Run Code Online (Sandbox Code Playgroud)

其中'模式'是例如

| Some(x) -> yadda | None -> blah
Run Code Online (Sandbox Code Playgroud)

(和

fun args -> expr
Run Code Online (Sandbox Code Playgroud)

是你如何定义一个lambda.)


cho*_*ida 8

Russ Cam的回答是正确的.

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

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

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

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

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