让我们按顺序构建与构造

时间:2012-09-08 14:20:06

标签: coding-style f# ocaml

考虑这个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代码中,此构造似乎非常频繁。 谢谢!

2 个答案:

答案 0 :(得分:4)

let x = a and y = b in c具有同时定义xy“的效果。这意味着评估顺序(a之前或之后b)未指定(您必须假设之前将评估a),并且x b未绑定ya未绑定clet 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序列更直观,更不容易出错,因此应该首选。