Что означает ключевое слово ' and ' в OCaml?

я озадачен and ключевое слово в OCaml. Смотрю сквозь код Я вижу

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, делая мой код менее хрупким для рефакторинга? Есть что-нибудь? иначе я должен был бы знать?

1 ответов


на 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 допускает, что.

[EDIT] меня беспокоило, что я не могу привести правильный пример, поэтому вот один пример, который вы часто увидите :

 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)

(вы можете найти этот пример здесь)

для взаимно рекурсивных типов сложнее найти конфигурацию, но после эта страница Википедии мы бы определили 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 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