OCaml的参数传递方案中的断点

Aad*_*hah 8 ocaml haskell ocaml-core

今天,我经历的源代码简街Core_kernel模块,我碰上了compose功能:

(* The typical use case for these functions is to pass in functional arguments
   and get functions as a result. For this reason, we tell the compiler where
   to insert breakpoints in the argument-passing scheme. *)
let compose f g = (); fun x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

我会将compose函数定义为:

let compose f g x = f (g x)
Run Code Online (Sandbox Code Playgroud)

他们给定义的原因compose,他们做的方式是"因为compose是需要的功能的功能fg作为参数和返回功能fun x -> f (g x),结果,他们定义compose他们确实告诉编译器之后插入一个断点的方式fg,但之前x在论证传递方案."

所以我有两个问题:

  1. 为什么我们在参数传递方案中需要断点?
  2. 如果我们定义compose正常方式会有什么不同?

来自Haskell,这个约定对我没有任何意义.

gsg*_*gsg 3

这是一种效率黑客,可以避免在评论中指出的预期用例中部分应用程序的成本。

OCaml 将柯里化函数编译为固定数量的构造,并在必要时使用闭包部分应用它们。这意味着该数量的调用是高效的——没有闭包构造,只有函数调用。

for内部会有一个闭包构造,但这比部分应用程序更有效。由部分应用程序生成的闭包会通过一个包装器,该包装器的存在是为了确保效果在正确的时间发生(如果该闭包本身是部分应用的)。composefun x -> f (g x)caml_curryN

编译器选择的固定数量基于简单的语法分析 - 本质上是连续采用多少个参数,中间没有任何参数。Jane St. 程序员使用它通过注入()“中间”参数来选择他们想要的数量。

简而言之,let compose f g x = f (g x)这是一个不太理想的定义,因为它会导致常见的双参数情况,compose f g成为更昂贵的部分应用程序。

当然,从语义上来说,根本没有区别。