2009-10-21 24 views
31

有時候,我看到這樣的代碼`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 

是什麼funfunction之間的區別?

+2

刪除了'fun'標籤,因爲它的定義與您的意圖不同。我認爲如果沒有它,問題會更好,因爲有些人使用忽略列表進行篩選。 – 2009-10-22 17:50:57

回答

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

+5

我沒有downvote,但是,描述'有趣'作爲首選,因爲它更緊湊不是整個故事,它甚至沒有描述如何使用它,並且絕不會比較這兩個關鍵字!函數與說,(fun x - > match x ...)相同,如果您打算進行模式匹配,那麼它是如何更緊湊? – nlucaroni 2009-10-22 15:00:13

+0

現在將更新更多細節。 – 2009-10-22 15:48:28

+0

我的答案引用了你的也被低估了。 – chollida 2009-10-27 01:47:38

8

Russ Cam在他的回答中是正確的。

下面是OCaml的列表上的帖子談論它

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

function只允許一個說法,但允許進行模式匹配,而fun是定義一個函數更一般的,靈活的方式。

除非有充分的理由使用函數,否則我通常會使用fun。

您可以在您發佈的代碼,其中fun聲明接受3個參數看這和function聲明中模式匹配它的輸入

+0

你也不能'let x y z = y + z',根本沒有'fun'或'function'? – 2009-10-22 01:28:25

+0

@Rosarch,當然可以。我認爲這個問題隱含着關於匿名函數的定義。 – 2009-10-22 13:06:30

+0

@Rosarch,肯定:) – chollida 2009-10-22 14:00:09

19

我想它的方式

function patterns 

是速記

(fun x -> match x with patterns) 

其中'圖案'是例如

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

(和

fun args -> expr 

是你如何定義一個lambda。)

相關問題