Jane Street的Core lib具有以下功能:Fn.const.
https://github.com/janestreet/core_kernel/blob/master/lib/fn.ml
let const c = (); fun _ -> c
Run Code Online (Sandbox Code Playgroud)
val const:'a - >'b - >'a
产生一个只返回其第一个参数的函数
我真的不明白.
();第一?let const c = fun () -> c?这将给出一个函数unit作为参数并始终返回初始值c.let f = const 5,f将成为一个以'_a参数为参数的函数.返回具有弱多态参数的函数的目的是什么?ps我看到Fn模块里面的几个函数都有();返回函数之前的用法是();什么?
sep*_*p2k 10
这个功能的目的是什么?在什么情况下我们必须使用它?
你需要在需要参数的函数的上下文中使用它,但实际上你并不关心参数,只想每次都返回相同的值.一个简单的例子是List.map (const 42) xs,它将n个项目的列表转换为n个42个列表.
一个不那么愚蠢(但更抽象)的例子是一个函数来做某事来产生一个值,但在某些情况下(比如,如果事情没有成功)条件反而调用一个用户提供的函数来产生值,而不是给它有关情况的一些信息作为论点.在某些情况下,您可能不会对信息进行说明,并且每次只返回相同的默认值,因此const可以在此处使用.
为什么要放(); 第一?
在其内部表示以及生成的代码中,OCaml编译器实际上具有多参数函数.如果你定义一个类似let f x y = ...or 的函数let f x = fun y -> ...,OCaml实际上会在内部将其转换为2参数函数(而不是返回另一个函数的1参数函数).所以,当你接着f 1 2调用它时,这是对2参数函数的简单调用,这比替代函数更有效.但是,如果您这样做f x,将生成一些额外的代码来创建闭包.这比直接返回闭包效率低.
因此,当您使用其所有参数调用函数时,此优化会提高性能,但如果不这样做,则实际上会适得其反.添加()前面会禁用优化(因为该函数不再具有该形式f x = fun y -> ...).因为const只用一个参数调用(直接调用const x y没有意义,因为你可以写x),这样可以提高性能.
为什么不把它写成让const c = fun() - > c?这将给出一个以单位为参数的函数,并始终返回初始c.
因为那时函数只能在unit预期函数获取的上下文中工作,这将是绝大多数情况.例如List.map (const 42) xs,现在只有xs在单位列表中才能工作,而这几乎肯定不是.
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |