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

时间:2016-05-31 09:13:21

标签: 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 个答案:

答案 0 :(得分: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中的多参数函数是包含在彼此内部的单参数函数序列(称为 currying ):

fun p_1 p_2 ... p_n -> body

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

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