今天,我浏览了简街的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)我会将compose函数定义为:
let compose f g x = f (g x)他们给出了定义compose的方式的原因是“因为compose是一个以函数f和g作为参数并作为结果返回函数fun x -> f (g x)的函数,他们定义compose的方式是告诉编译器在f和g之后但在参数传递方案中x之前插入断点。”
所以我有两个问题:
compose,会有什么不同呢?从哈斯克尔来的,这个会议对我来说没有任何意义。
发布于 2015-03-22 06:43:40
这是一种有效的攻击,以避免在注释中所示的预期用例中部分应用程序的成本。
OCaml将仓促的函数编译成固定的结构,在必要时使用闭包部分应用它们。这意味着,对这种特性的调用是有效的--没有闭包结构,只有函数调用。
compose中将为fun x -> f (g x)提供一个闭包结构,但这将比部分应用程序更有效。由部分应用程序生成的闭包通过存在的包装器caml_curryN来确保效果在正确的时间发生(如果该闭包本身是部分应用的话)。
编译器所选择的固定性是基于一个简单的语法分析--本质上是,在一列中取了多少个参数,其间没有任何内容。Jane St. .程序员使用这种方法通过在“中间”参数中插入()来选择他们想要的特性。
简而言之,let compose f g x = f (g x)是一个不那么理想的定义,因为它将导致常见的两个参数情况,即compose f g是一个更昂贵的部分应用程序。
当然,在语义上,根本没有区别。
发布于 2015-03-22 23:07:08
值得注意的是,在OCaml中部分应用程序的编译已经有所改进,并且不再需要这种性能攻击。
https://stackoverflow.com/questions/29191484
复制相似问题