首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Let和结构与let的顺序

Let和结构与let的顺序
EN

Stack Overflow用户
提问于 2012-09-08 22:20:06
回答 2查看 150关注 0票数 3

考虑下面的OCaml代码:

代码语言:javascript
复制
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代码中似乎很常见。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-08 22:34:49

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

我很少使用这种结构,因为我过去曾被计算顺序的事情所困扰。然而,我经常使用它的递归变体let rec ... and ... in ... (其中所有的变量界限都是可用的)来定义相互递归的函数。

代码语言:javascript
复制
let rec even n = (n = 0) || odd (n - 1)
and odd n = (n <> 0) && even (n - 1)
票数 4
EN

Stack Overflow用户

发布于 2012-09-08 22:42:54

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

代码语言:javascript
复制
let rec low,_,_ = cases.[i]
and _,high,_ = cases.[j]

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12331538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档