Function 在ocaml中使用fun关键字

Function 在ocaml中使用fun关键字,function,ocaml,Function,Ocaml,由于Ocaml使用类型推断,函数是一种类型,我是否必须使用fun来声明函数?例如,Ocaml的REPL/解释器毫无怨言地执行此语句: let average a b = (a +. b) /. 2.0;; 这是否意味着在声明函数时可以省去fun?什么时候需要,或者曾经需要过 匿名函数需要关键字fun。例如,下面的代码将列表的每个元素加倍l=[1;2;3;4] let l = [1; 2; 3; 4] let doubled_l = List.map (fun x -> 2 * x)

由于Ocaml使用类型推断,函数是一种类型,我是否必须使用
fun
来声明函数?例如,Ocaml的REPL/解释器毫无怨言地执行此语句:

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

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

匿名函数需要关键字
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
let average = fun x y -> (x +. y) /. 2.  
(甚至
List.map((*)2)l

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

let l = [1; 2; 3; 4]
let double x = 2 * x
let doubled_l = List.map double l
let average = fun x y -> (x +. y) /. 2.  


(语法
average xy=…
实际上是该表单的语法糖)

匿名函数需要关键字
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
let average = fun x y -> (x +. y) /. 2.  
(甚至
List.map((*)2)l

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

let l = [1; 2; 3; 4]
let double x = 2 * x
let doubled_l = List.map double l
let average = fun x y -> (x +. y) /. 2.  


(语法
average xy=…
实际上是这种形式的语法糖)

let average a b=…
完全等同于
let average=fun a b->…
-你可以使用前者而不是后者。这只是你喜欢哪一种风格的问题。我的感觉是,大多数程序员使用前一种形式,但一些介绍性材料使用后一种形式,以明确函数与其他函数一样是值,可以使用
fun
关键字创建函数

然而,
let f=fun…
并不是使用
fun
的唯一方法。您可以在任何需要函数类型值的地方使用它,例如作为
map
的参数。所以,如果您有类似于
List.map(funx->x+1)xs
的东西,您就不能用
let
来代替
fun
,因为定义在这里没有语法意义。当然,您可以在List.map add1 xs中使用
让add1 x=x+1,这样可以很好地工作,但这样会更详细,并引入一个新名称,该名称只使用一次,实际上不会添加任何内容


因此,当你想传递一个函数而不给它命名时,
fun
非常有用。

让平均值a b=…
let average=fun a b->…
-你总是可以使用前者而不是后者。这只是你喜欢哪一种风格的问题。我的感觉是,大多数程序员使用前一种形式,但一些介绍性材料使用后一种形式,以明确函数与其他函数一样是值,可以使用
fun
关键字创建函数

然而,
let f=fun…
并不是使用
fun
的唯一方法。您可以在任何需要函数类型值的地方使用它,例如作为
map
的参数。所以,如果您有类似于
List.map(funx->x+1)xs
的东西,您就不能用
let
来代替
fun
,因为定义在这里没有语法意义。当然,您可以在List.map add1 xs中使用
让add1 x=x+1,这样可以很好地工作,但这样会更详细,并引入一个新名称,该名称只使用一次,实际上不会添加任何内容

因此,当您希望传递函数而不给它命名时,
fun
非常有用