gpt4 book ai didi

syntax - OCaml 中的 `and` 关键字是什么意思?

转载 作者:行者123 更新时间:2023-12-04 01:50:52 24 4
gpt4 key购买 nike

我对 and 感到困惑OCaml 中的关键字。看透this code , 我懂了

type env = {
(* fields for a local environment described here *)
}

and genv {
(* fields for a global environment here *)
}

然后 later ,
let rec debug stack env (r, ty) = (* a function definition *)

and debugl stack env x = (* another function definition *)

这里发生了什么? and关键字只需复制最后一个 type , let , 或 let rec陈述?是否有 and rec 之类的东西?陈述?为什么我要使用 and而不是仅仅输入 lettype ,让我的代码不那么容易重构?还有什么我应该知道的吗?

最佳答案

and关键字用于避免多个 let (第一个例子,我从不使用它,但为什么不使用它)或类型、函数、模块的相互递归定义......
正如您在第二个示例中看到的那样:

let rec debug stack env (r, ty) =
...
| Tunresolved tyl -> o "intersect("; debugl stack env tyl; o ")"
...

and debugl stack env x =
...
| [x] -> debug stack env x
...
debug来电 debugl反之亦然。所以 and是允许的。
[编辑] 没有给出一个合适的例子让我很困扰,所以这里有一个你经常会看到的例子:
let rec is_even x =
if x = 0 then true else is_odd (x - 1)
and is_odd x =
if x = 0 then false else is_even (x - 1)

(* second version *)

let rec is_even x =
x = 0 || is_odd (x - 1)
and is_odd x =
x <> 0 && is_even (x - 1)
(你可以找到这个例子 here )
对于相互递归的类型,很难找到配置但遵循 this wikipedia page我们将定义 treesforests如下
 type 'a tree = Empty | Node of 'a * 'a forest
and 'a forest = Nil | Cons of 'a tree * 'a forest
例如,由空树组成的森林,标记为 a 的单例树和带有标签 b 的两节点树和 c然后将表示为:
 let f1 = Cons (Empty, (* Empty tree *)
Cons (Node ('a', (* Singleton tree *)
Nil), (* End of the first tree *)
Cons (Node ('b', (* Tree composed by 'b'... *)
Cons (Node ('c', (* and 'c' *)
Nil),
Nil)
),
Nil (* End ot the second tree *)
)
)
);;

并且大小函数(计算森林中的节点数)将是:
let rec size_tree = function
| Empty -> 0
| Node (_, f) -> 1 + size_forest f
and size_forest = function
| Nil -> 0
| Cons (t, f) -> size_tree t + size_forest f
我们得到
# size_forest f1;;
- : int = 3

关于syntax - OCaml 中的 `and` 关键字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38884482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com