有时我会看到像
这样的代码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
之间的区别是什么?
答案 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
通常是首选。
答案 1 :(得分:21)
我想的方式
function patterns
是
的简写(fun x -> match x with patterns)
其中'模式'就是这样。
| Some(x) -> yadda | None -> blah
(以及
fun args -> expr
是你如何定义一个lambda。)
答案 2 :(得分:8)
Russ Cam的答案是正确的。
这是在OCaml列表上发布的关于它的帖子
function
只允许一个参数但允许模式匹配,而fun
是定义函数的更通用和灵活的方法。
除非有充分理由使用功能,否则我通常会玩得很开心。
你可以在你发布的代码中看到这个,其中fun
声明有3个参数,而function
声明在它的输入上进行模式匹配
答案 3 :(得分:0)
fun x1 ... xn -> e
是
的缩写function x1 -> ... -> function xn -> e