kos*_*hei 14 ocaml scope coding-style ml let
我意识到这可能是一个愚蠢的问题,但......
如果我链接了一堆let里面做陈述并不需要知道对方的价值观,是它更好地使用and或in?
例如,如果有的话,哪一个更可取:
let a = "foo"
and b = "bar"
and c = "baz"
in
(* etc. *)
Run Code Online (Sandbox Code Playgroud)
要么
let a = "foo" in
let b = "bar" in
let c = "baz"
in
(* etc. *)
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,前者应该"更好"(通过对"更好"的非常小的定义),因为它创造了必要的最小范围,而后者是范围内的范围.编译器/解释器注意的范围,但最终是不重要和不必要的深度.
我的意见是这样in更好。的使用and意味着这些定义相互依赖。我认为最好明确一点,事实并非如此。另一方面,一些 OCaml 程序员确实更喜欢and非常短的定义,在这种情况下,稍微更紧凑的符号可能看起来更清晰。当您可以将定义放在一行中时尤其如此:
let a = "foo" and b = "bar" in
Run Code Online (Sandbox Code Playgroud)
“哪个更好?”这个问题的答案 只有当解释没有不同时才真正有意义。ML 系列语言(至少 SML 和 OCaml)同时具有并行初始化形式 ( and) 和顺序的、本质上是嵌套范围的形式 ( in),因为它们在某些情况下都很有用。
在您的情况下,语义是相同的,因此您需要回答“什么最适合您?”的问题。也许(如果这还为时过早的话)“哪个可能会更有效地执行?” 对于您的情况,替代方案是:
对于这种and情况:评估一堆字符串并对三个标识符进行并行绑定。
对于这种in情况:绑定foo到a,然后绑定bar到b,然后绑定baz到c。
哪个读起来更好?在这种情况下,这是一个折腾,因为结果并不重要。你可以对一些说英语的人进行民意调查,但我怀疑会有很多人偏爱。也许大多数人会喜欢and,因为它将绑定分开,将鞋底留in在表达式之前。
至于什么执行效率更高,我认为一个好的编译器可能会产生相同的代码,因为它可以检测绑定的顺序并不重要。但也许您有一个编译器,可以为多核处理器生成代码,从而更好地处理and. 或者可能是一个简单的编译器将所有 RHS 写入临时存储,然后绑定它们,从而使情况and变慢。
这些可能是非必要的优化问题,特别是因为它们涉及绑定并且可能不在紧密循环中。
底线:在这种情况下,这是一个真正的难以抉择的问题。只要确保在结果确实重要时正确使用并行与顺序即可。