ocaml - 了解Core的 `Fn.const`

标签 ocaml ocaml-core

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/

    相关文章:

    ocaml - Frama-C 插件开发 : Getting result of value-analysis

    functional-programming - 模式与逻辑匹配?

    ocaml - 如何将 OCaml 目标文件与核心模块链接?

    ocaml - 没有为以下模块提供实现

    OCaml:使用 Core Set 添加元素的惯用方法是什么?

    linux - 中断执行并在终端打印部分信息

    list - 如何在 OCaml 中取两个列表的乘积?

    parsing - 解决 yacc/ocamlyacc 中的 reduce/reduce 冲突

    ocaml-core 相当于 Unix.create_process

    ocaml - 如何避免在 Ocaml 中隐藏 stdlib 模块?