Syntax 在OCaml中,`and`关键字是什么意思?

Syntax 在OCaml中,`and`关键字是什么意思?,syntax,ocaml,Syntax,Ocaml,我对OCaml中的和关键字感到迷惑。透过看,我明白了 那么 这是怎么回事?和关键字是否只是复制最后一个类型、let或let rec语句?是否存在和rec语句?为什么我要使用和而不是只键入let或type,使我的代码不易重构?还有什么我应该知道的吗?和关键字用于避免多个let(第一个示例,我从不使用它,但为什么不使用它)或用于类型、函数、模块的相互递归定义 正如您在第二个示例中所看到的: let rec debug stack env (r, ty) = ... | Tunresolv

我对OCaml中的
关键字感到迷惑。透过看,我明白了

那么


这是怎么回事?
关键字是否只是复制最后一个
类型
let
let rec
语句?是否存在
和rec
语句?为什么我要使用
而不是只键入
let
type
,使我的代码不易重构?还有什么我应该知道的吗?

关键字用于避免多个
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
,反之亦然。因此,
允许这样做

[编辑]没有给出一个合适的例子让我很困扰,所以这里有一个你经常看到的例子:

 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)
(您可以找到此示例)

对于相互递归的类型,很难找到配置,但下面我们将定义
,如下所示

 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
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