3

考虑这个 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 代码中似乎很常见。谢谢!

4

2 回答 2

4

let x = a and y = b in c具有定义xy“同时”的效果。这意味着评估的顺序(a之后或之前b)是未指定的(您不能假设a将在之前评估),并且不受约束x,也不受约束,它们仅在 中可用。byac

我很少使用这种结构,因为我过去被评估顺序的东西咬过。但是,我经常使用它的递归变体let rec ... and ... in ...(所有变量绑定在任何地方都可用)来定义相互递归的函数。

let rec even n = (n = 0) || odd (n - 1)
and odd n = (n <> 0) && even (n - 1)
于 2012-09-08T14:34:49.350 回答
2

在 F#let ... and ...中是禁止的,但您仍然可以编写:

let rec low,_,_ = cases.[i]
and _,high,_ = cases.[j]

正如@gasche 所说,let rec ... and ...主要用于定义相互递归的函数/类型。我认为使用一系列let更直观,更不容易出错,因此应该首选。

于 2012-09-08T14:42:54.237 回答