首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml参数传递方案中的断点

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

Stack Overflow用户
提问于 2015-03-22 05:55:49
回答 2查看 135关注 0票数 8

今天,我浏览了简街Core_kernel模块的源代码,并编写了compose函数:

代码语言:javascript
复制
(* 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函数定义为:

代码语言:javascript
复制
let compose f g x = f (g x)

他们给出了定义compose的方式的原因是“因为compose是一个以函数fg作为参数并作为结果返回函数fun x -> f (g x)的函数,他们定义compose的方式是告诉编译器在fg之后但在参数传递方案中x之前插入断点。”

所以我有两个问题:

  1. 为什么我们需要断点的论点通过方案?
  2. 如果我们用正常的方式定义compose,会有什么不同呢?

从哈斯克尔来的,这个会议对我来说没有任何意义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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是一个更昂贵的部分应用程序。

当然,在语义上,根本没有区别。

票数 3
EN

Stack Overflow用户

发布于 2015-03-22 23:07:08

值得注意的是,在OCaml中部分应用程序的编译已经有所改进,并且不再需要这种性能攻击。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29191484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档