2016-05-31 60 views
0

我是ocaml的新手,我對一件事情感到困惑: 當我聲明一個函數時,這些方式有什麼區別嗎?ocaml - 聲明函數的最佳方法?

1)

let f e l = 
match l with 
| []->[] 
| h :: t -> if h=e then t else h :: f e t;; 

2)

let e = function 
h :: t -> if h=e then t else h :: f e t 
| []->[];; 
+1

您的兩個示例中都缺少'rec'關鍵字,並且聲明2中缺少名稱'f'。公寓這,都是好的,但我會傾向personnaly寫1)。 – lavi

回答

1

不,不是真的在這種情況下(當上的最後一個參數 「多變量」 功能模式匹配)。 function關鍵字允許您使用一個參數創建函數值,並且當函數應用於某個值時,該值將與模式進行模式匹配。

但是,如果我試圖模式匹配非最後一個參數,我會使用第一個變體。下面是從問題的代碼衍生的幾個例子(我在函數的簽名交換el):

1)這很容易,我們只是在所有的功能應用的地方複製功能的身體和交換的參數:

let rec f l e = match l with 
    | [] -> [] 
    | h :: t -> if h=e then t else h :: f t e 

2)隨着function這是一個有點麻煩:

let rec f = function 
    | [] -> fun e -> [] 
    | h :: t -> fun e -> if h=e then t else h :: f e t 

要理解爲什麼第二個變體的作品,記得在OCaml的多參數的函數是唱的序列包裹在裏面互相LE-參數的函數(這就是所謂的討好):

fun p_1 p_2 ... p_n -> body 

相同

fun p_1 -> fun p_2 -> ... fun p_n -> body 

注意:當然,如果函數的身體並不僅僅在於match施工,您不能使用function