【发布时间】:2012-05-26 20:54:24
【问题描述】:
注意,在 Caml 中,最好对多参数函数使用 Curried 函数定义,而不是元组。
将'a -> 'b -> 'c 调用约定与'a * 'b -> 'c 进行比较时。
在使用 SML/NJ 时,我习惯于将元组类型用于输入和输出:('a * 'b) -> ('c * 'd),因此使用元组表示多个输入似乎与我表示多个输出的方式是对称的。
为什么对于元组参数的 OCaml 函数声明建议使用柯里化?是允许柯里化/部分评估带来更大的灵活性,还是从 OCaml 编译器的实现细节中获得一些其他好处?
【问题讨论】:
-
Caml-light 及后续版本中大部分函数的柯里化选择在报告“ZINC 实验:ML 语言的经济实现”中进行了说明。我记得的一件事是,使用适当的评估方案(在报告中描述),一个柯里化函数不需要分配就可以被调用。 caml.inria.fr/pub/papers/xleroy-zinc.ps.gz
-
@PascalCuoq,而一个元组需要被分配、解包,然后 GCed?
-
这是另一个问题,但要回答,不,你不应该。上次我检查它甚至没有优化
a, b在match a, b with x, y -> ...中的分配。如果您想自己检查,我发现阅读ocamlopt -S生成的x86 程序集对我来说很方便,因为我不必学习新的表示。 -
需要明确的是,元组函数通常不需要在针对它们进行优化的编译器中进行分配,在大多数 SML 实现中都是如此。作为标准展平优化的一部分,N 元参数/结果元组通常编译为 N 个参数/结果。仅当以一流的方式给出或使用参数/结果元组时,才会发生额外的装箱/拆箱(即恰好在您无法以咖喱形式表达的情况下)。
-
帕斯卡,你的第一条评论很有趣,来源丰富,是安德烈亚斯回答的绝佳补充。您为什么不将其发布为答案?我很确定
match a,b with x,y -> ...已经过优化;事实上,我们最近甚至讨论了此优化的an extension,欢迎对此提供反馈。