考虑下面的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代码中似乎很常见。谢谢!
发布于 2012-09-08 22:34:49
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)发布于 2012-09-08 22:42:54
在F#中,let ... and ...是被禁止的,但您仍然可以这样写:
let rec low,_,_ = cases.[i]
and _,high,_ = cases.[j]正如@gasche所说,let rec ... and ...主要用于定义相互递归的函数/类型。我认为使用let序列更直观,更不容易出错,因此应该是首选。
https://stackoverflow.com/questions/12331538
复制相似问题