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
我真的不明白。
();
第一的? let const c = fun () -> c
?这将给出一个函数 unit
作为参数并且总是返回初始c
. let f = const 5
, f
将成为一个函数,它需要 '_a
作为参数。返回具有弱多态参数的函数的目的是什么? p.s.我看到
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 编译器实际上具有多参数函数。如果你定义一个像
let f x y = ...
这样的函数或 let 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.
因为这样该函数只能在函数采用
unit
的上下文中工作。预计,这将是极少数情况。例如 List.map (const 42) xs
现在只有在 xs
时才有效是一个单位列表,几乎可以肯定不是。
关于ocaml - 了解Core的 `Fn.const`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120623/