有時候,我看到這樣的代碼`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
之間的區別?
有時候,我看到這樣的代碼`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
之間的區別?
的語義,這是一樣的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。
Russ Cam在他的回答中是正確的。
下面是OCaml的列表上的帖子談論它
function
只允許一個說法,但允許進行模式匹配,而fun
是定義一個函數更一般的,靈活的方式。
除非有充分的理由使用函數,否則我通常會使用fun。
您可以在您發佈的代碼,其中fun
聲明接受3個參數看這和function
聲明中模式匹配它的輸入
你也不能'let x y z = y + z',根本沒有'fun'或'function'? – 2009-10-22 01:28:25
@Rosarch,當然可以。我認爲這個問題隱含着關於匿名函數的定義。 – 2009-10-22 13:06:30
@Rosarch,肯定:) – chollida 2009-10-22 14:00:09
我想它的方式
function patterns
是速記
(fun x -> match x with patterns)
其中'圖案'是例如
| Some(x) -> yadda | None -> blah
(和
fun args -> expr
是你如何定義一個lambda。)
刪除了'fun'標籤,因爲它的定義與您的意圖不同。我認爲如果沒有它,問題會更好,因爲有些人使用忽略列表進行篩選。 – 2009-10-22 17:50:57