Function 在ocaml中使用fun关键字
由于Ocaml使用类型推断,函数是一种类型,我是否必须使用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)
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
非常有用