我是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
| []->[];;
答案 0 :(得分:1)
不,在这种情况下不是 (当对“多参数”函数的最后一个参数进行模式匹配时)。 function
关键字允许您使用一个参数创建一个功能值,并且当该函数应用于某个值时,该值将根据模式进行模式匹配。
但是如果我尝试在非最后一个参数上进行模式匹配,我会使用第一个变体。以下是从问题中的代码派生的几个示例(我在函数的签名中交换了e
和l
):
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
。