在ocaml中使用fun关键字

时间:2018-09-20 15:30:45

标签: function ocaml

由于Ocaml利用类型推断,并且函数是类型,因此我是否必须使用fun来声明函数?例如,用于Ocaml的REPL /解释器执行以下语句时不会产生投诉:

let average a b =
  (a +. b) /. 2.0;;

这是否意味着我在声明函数时可以省去fun?什么时候需要,或者曾经需要?

2 个答案:

答案 0 :(得分:4)

匿名功能需要关键字fun。例如,以下代码将列表l = [ 1; 2; 3; 4]

的每个元素加倍
let l = [1; 2; 3; 4]
let doubled_l = List.map (fun x -> 2 * x) l

但此代码段可以重写为

let l = [1; 2; 3; 4]
let double x = 2 * x
let doubled_l = List.map double l

(甚至是List.map ( ( * ) 2 ) l

相反,您的平均函数可以重写为

let average = fun x y -> (x +. y) /. 2.  

let average = fun x -> fun y -> (x +. y) /. 2.  

(语法average x y = ...实际上是这种形式的语法糖)

答案 1 :(得分:2)

let average a b = ...等同于let average = fun a b -> ...-您可以始终在前者上使用前者。您只喜欢一个样式问题。我的感觉是,大多数程序员都使用前一种形式,但是一些介绍性材料使用后一种形式来明确说明函数是与其他函数一样的值,并且可以使用fun关键字来创建。

然而,let f = fun ...不是唯一使用fun的方法。您可以在需要函数类型值的任何地方使用它,例如,将其用作map的参数。因此,如果您有类似List.map (fun x -> x+1) xs之类的内容,则不能仅用let代替fun,因为那里的定义在语法上没有意义。您当然可以使用let add1 x = x+1 in List.map add1 xs,并且效果很好,但这更加冗长,并引入了只使用一次且实际上没有添加任何内容的新名称。

因此,fun在您想要传递函数而不给它命名时非常有用。