由于Ocaml利用类型推断,并且函数是类型,因此我是否必须使用fun
来声明函数?例如,用于Ocaml的REPL /解释器执行以下语句时不会产生投诉:
let average a b =
(a +. b) /. 2.0;;
这是否意味着我在声明函数时可以省去fun
?什么时候需要,或者曾经需要?
答案 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
在您想要传递函数而不给它命名时非常有用。