ocaml – 了解Core的`Fn.const`

Jane Street的Core lib具有以下功能:Fn.const.

https://github.com/janestreet/core_kernel/blob/master/lib/fn.ml

let const c = (); fun _ -> c

val const : ‘a -> ‘b -> ‘a
produces a function that just returns its first argument

我真的不明白.

>这个功能的目的是什么?在什么情况下我们必须使用它?
>为什么要放();第一?
>为什么不把它写成让const c = fun() – > C?这将给出一个以单位为参数的函数,并始终返回初始c.
>如果我确实让f = const 5,f将成为一个以’_a为参数的函数.返回具有弱多态参数的函数的目的是什么?

附:我看到Fn模块里面的几个函数都有();在返回函数之前,()的用法是什么?

最佳答案

What’s the purpose of this function? In what scenario we have to use it?

你需要在需要参数的函数的上下文中使用它,但实际上你并不关心参数,只想每次都返回相同的值.一个简单的例子是List.map(const 42)xs,它将n个项目的列表转换为n个42s的列表.

一个不那么愚蠢(但更抽象)的例子就是一个能够产生价值的函数,但在某些情况下(比如,如果事情没有成功)条件反而调用用户提供的函数来产生值而不是给它有关情况的一些信息作为论点.在某些情况下,您可能不会对信息进行说明,并且每次都返回相同的默认值,因此const可以在这里工作.

Why put (); first?

在其内部表示以及生成的代码中,OCaml编译器实际上具有多参数函数.如果你定义一个函数,比如让f x y = …或者让f x = fun y – > …,OCaml实际上在内部将其转换为2参数函数(而不是返回另一个函数的1参数函数).所以当你然后做f 1 2来调用它时,这是对2参数函数的简单调用,这比替代函数更有效.但是,如果您只是执行f x,则会生成一些额外的代码来创建闭包.这比直接返回闭包效率低.

因此,当您使用其所有参数调用函数时,此优化会提高性能,但如果不这样做,则实际上会适得其反.在前面添加()会禁用优化(因为该函数不再具有f x = fun y – > …的形式).因为const只是用一个参数调用(直接调用const x y没有意义,因为你可以写x),这样可以提高性能.

Why not write it as let const c = fun () -> c? this will give a function taking unit as parameter and always returns initial c.

因为那时函数只能在预期函数获取单元的上下文中工作,这将是绝大多数情况.例如,List.map(const 42)xs现在只有在xs是单位列表的情况下才有效,而这几乎肯定不是.

转载注明原文:ocaml – 了解Core的`Fn.const` - 代码日志