15

我意识到这可能是一个愚蠢的问题,但是......

如果我要链接一堆不需要知道彼此值的语句,使用letor更好吗?andin

例如,如果有的话,哪些是更可取的:

let a = "foo"
and b = "bar"
and c = "baz"
in
  (* etc. *)

或者

let a = "foo" in
let b = "bar" in
let c = "baz"
in
  (* etc. *)

我的直觉告诉我,前者应该是“更好”(通过对“更好”的一个非常狭隘的定义),因为它创建了必要的最小范围,而后者是一个范围内的范围内 -编译器/解释器注意但最终不重要且不必要的深度的范围。

4

4 回答 4

6

我的意见是这样in更好。的使用and意味着定义相互依赖。我认为最好清楚事实并非如此。另一方面,一些 OCaml 程序员确实更喜欢and非常短的定义,其中稍微紧凑的表示法看起来更干净。当您可以将定义放在一行时尤其如此:

let a = "foo" and b = "bar" in
于 2011-06-15T14:25:05.687 回答
4

“哪个更好?”这个问题的答案 只有当解释没有不同时才真正有意义。ML 系列语言(至少 SML 和 OCaml)既有并行初始化and形式in

在您的情况下,语义是相同的,因此您需要回答“什么对您来说最适合?”这个问题。也许(如果这不是为时过早的话)“可能会更有效地执行?” 在您的情况下,替代方案是:

  • 对于这种and情况:评估一堆字符串并对三个标识符进行并行绑定。

  • 对于这种in情况:绑定fooa然后绑定barb然后绑定bazc

哪个更好读?在这种情况下这是一个折腾,因为结果并不重要。你可以对一些说英语的人进行投票,但我怀疑会有很多偏好。也许大多数人会喜欢and,因为它将绑定分开in,在表达式之前留下唯一的。

至于什么执行效率更高,我认为一个好的编译器可能会产生相同的代码,因为它可以检测绑定的顺序无关紧要。但也许您有一个编译器,它为多核处理器生成代码,在and. 或者可能是一个天真的编译器,它将所有 RHS 写入临时存储然后绑定它们,从而使and案例变慢。

这些可能是非必要的优化问题,特别是因为它们涉及绑定并且可能不在紧密循环中。

底线:在这种情况下,这是一个真正的折腾;只要确保在结果确实重要时正确使用并行与顺序。

于 2011-07-21T01:10:59.877 回答
2

我会说 in 更好,因为它缩小了范围并更好地表达了意图。如果我看到所有这些定义以共享范围的方式链接在一起,我会觉得这样做是有原因的,并且会寻找它们如何相互影响。

于 2011-06-15T02:26:08.337 回答
2

我相信 这与 Lisp 之间的区别let和Lisp 中的区别相同。(在功能上类似于结构 - 您问题中的第二个结构)有时用于隐藏命令式编程,因为它保证了表达式的顺序执行(请参阅 Paul Graham 在On Lisp中对 let* 所说的话)。let*let*in..in..

所以,我会说前一种构造更好。但事实是,我认为后者在我见过的 Ocaml 程序中更常见。可能只是更容易使用让一个在以前命名的表达式上构建。

于 2011-06-15T03:48:22.587 回答