考虑这个OCaml代码:
let coupe_inter i j cases =
let lcases = Array.length cases in
let low,_,_ = cases.(i)
and _,high,_ = cases.(j) in
low,high,
Array.sub cases i (j-i+1),
case_append (Array.sub cases 0 i) (Array.sub cases (j+1) (lcases-(j+1)))
为什么使用表达式let ... and ... in
代替let ... in let ... in
序列(比如F#强制你做)?在OCaml代码中,此构造似乎非常频繁。
谢谢!
答案 0 :(得分:4)
let x = a and y = b in c
具有同时定义x
和y
“的效果。这意味着评估顺序(a
之前或之后b
)未指定(您必须不假设之前将评估a
),并且x
b
未绑定y
,a
未绑定c
,let rec ... and ... in ...
仅限于let rec even n = (n = 0) || odd (n - 1)
and odd n = (n <> 0) && even (n - 1)
。
我很少使用这种结构,因为我过去被评估订单的东西咬了。我经常使用它的递归变体{{1}}(其中所有变量绑定在任何地方都可用),但是,要定义相互递归的函数。
{{1}}
答案 1 :(得分:2)
在F#let ... and ...
被禁止,但你仍然可以写:
let rec low,_,_ = cases.[i]
and _,high,_ = cases.[j]
正如@gasche所说,let rec ... and ...
主要用于定义相互递归的函数/类型。我认为使用let
序列更直观,更不容易出错,因此应该首选。