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 参数创建函数值,并且当函数应用于值时,该值与模式进行模式匹配。
但如果我尝试对非最后一个参数进行模式匹配,我会使用第一个变体。这是从问题中的代码派生的几个示例(我在函数签名中交换了 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
。
我是 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 参数创建函数值,并且当函数应用于值时,该值与模式进行模式匹配。
但如果我尝试对非最后一个参数进行模式匹配,我会使用第一个变体。这是从问题中的代码派生的几个示例(我在函数签名中交换了 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
。