2012-09-08 12 views
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

let x = a and y = b in c具有“同时”定义xy的效果。这意味着,评估(a后或b之前)的顺序是不确定的(你必须假设a将之前评估),而xbya没有约束的约束,他们是唯一可用在c

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

let rec even n = (n = 0) || odd (n - 1) 
and odd n = (n <> 0) && even (n - 1) 
2

在F#let ... and ...是禁止的,但你仍然可以这样写:

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

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