Что означает ключевое слово ' 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