Coding style “更好地使用”;及;或;在;当链接时“;让我们;声明?

Coding style “更好地使用”;及;或;在;当链接时“;让我们;声明?,coding-style,ocaml,scope,ml,let,Coding Style,Ocaml,Scope,Ml,Let,我知道这可能是个愚蠢的问题,但是 如果我链接了一堆不需要知道彼此值的let语句,那么在中使用和或更好吗 例如,以下哪一项更可取(如果有的话): let a = "foo" and b = "bar" and c = "baz" in (* etc. *) 或 我的直觉告诉我,前者应该是“更好的”(通过一个非常小的“更好”定义),因为它创建了所需的最小范围,然而,后者是编译器/解释器注意到的范围内的范围,但最终不重要,而且不必要深入。我认为in更好,因为它缩小了范围,更好地表达了意图。如果我

我知道这可能是个愚蠢的问题,但是

如果我链接了一堆不需要知道彼此值的
let
语句,那么在
中使用
更好吗

例如,以下哪一项更可取(如果有的话):

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


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

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

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


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

我的意见是,
中的
更好。使用
意味着这些定义相互依赖。我认为最好明确的是,情况并非如此。另一方面,一些OCaml程序员确实更喜欢
来定义非常短的定义,在这些定义中稍微紧凑一些的表示法看起来更简洁。当您可以在一行中拟合定义时,尤其如此:

let a = "foo" and b = "bar" in

只有在解释没有差异的情况下,“哪一个更好?”这个问题的答案才真正有意义。ML语言家族(至少SML和OCaml)既有并行初始化形式(
)又有顺序的、本质上是嵌套的作用域形式(

在您的案例中,语义是相同的,因此您需要回答“什么对您来说最合适?”以及(如果这不是过早的话)“哪种可能执行得更有效?”在您的案例中,备选方案是:

  • 对于
    情况:计算一组字符串并对三个标识符进行并行绑定

  • 对于
    案例中的
    :将
    foo
    绑定到
    a
    ,然后将
    bar
    绑定到
    b
    ,然后将
    baz
    绑定到
    c

哪个读起来更好?在这种情况下,这是一个难题,因为结果并不重要。你可以对一些说英语的人进行民意调查,但我怀疑他们会有多少偏好。也许大多数人会喜欢
,因为它将绑定分开,将唯一的
放在表达式之前的

至于什么执行效率更高,我认为一个好的编译器可能会产生相同的代码,因为它可以检测绑定的顺序并不重要。但也许您有一个编译器,它可以为多核处理器生成代码,而多核处理器在
方面做得更好。或者可能是一个幼稚的编译器,它将所有RHS写入临时存储,然后绑定它们,使
的大小写速度变慢

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


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

即使不使用
let rec
,它们是否可以相互依赖?正如nimrodm所说,以下方法不起作用(意味着
可能并不总是意味着依赖):
让a=3和b=a+7 in(*……*)
我完全忘记了保证顺序执行;谢谢你提醒我。
let a = "foo" and b = "bar" in