ocaml - 声明函数的最佳方式?

ocaml - best way to declare a function?

我是 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
| []->[];;

不,不是真的 在这种情况下 (当对 "multi-argument" 函数的最后一个参数进行模式匹配时)。 function 关键字允许您使用 one 参数创建函数值,并且当函数应用于值时,该值与模式进行模式匹配。

但如果我尝试对非最后一个参数进行模式匹配,我会使用第一个变体。这是从问题中的代码派生的几个示例(我在函数签名中交换了 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 中的多参数函数是相互包裹的单参数函数序列(称为 currying):

fun p_1 p_2 ... p_n -> body

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

注意:当然,如果函数体不完全由match构造组成,则不能使用function