OCaml 中的“and”关键字是什么意思?

问题描述 投票:0回答:1

我对 OCaml 中的

and
关键字感到困惑。浏览这段代码,我明白了

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

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

然后稍后

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
而不是只输入
let
type
,让我的代码更不易重构?还有什么我应该知道的吗?

syntax ocaml
1个回答
31
投票

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)

(您可以在此处找到此示例)

对于相互递归类型,很难找到配置,但是按照 这个维基百科页面,我们将定义

trees
forests
如下

 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 second tree *)
                   Cons (Node ('b', (* Tree composed by 'b'... *)
                               Cons (Node ('c', (* and 'c' *)
                                           Nil), 
                                     Nil)
                           ),
                         Nil (* End of the third 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
© www.soinside.com 2019 - 2024. All rights reserved.