Từ khóa and
được sử dụng hoặc để tránh nhiều let
(ví dụ đầu tiên, tôi không bao giờ sử dụng nó cho việc này nhưng tại sao không) hoặc cho các định nghĩa đệ quy lẫn nhau của các loại, chức năng, module ...
Như bạn có thể nhìn thấy trong ví dụ thứ hai của bạn:
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
cuộc gọi debugl
và ngược lại. Vì vậy, and
là cho phép điều đó.
[EDIT] Nó làm phiền tôi không đưa ra một ví dụ thích hợp vì vậy đây là một ví dụ mà bạn thường sẽ thấy:
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)
(Bạn có thể tìm thấy ví dụ này here)
Đối với hai bên đệ quy loại, đó là khó khăn hơn để tìm thấy một cấu hình nhưng sau this wikipedia page chúng tôi sẽ xác định trees
và forests
như sau
type 'a tree = Empty | Node of 'a * 'a forest
and 'a forest = Nil | Cons of 'a tree * 'a forest
Như một ví dụ, một khu rừng gồm các cây trống, cây singleton nhãn 'a' và một cây hai nút có nhãn 'b' và 'c' sau đó sẽ được biểu diễn dưới dạng:
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 *)
)
)
);;
Và kích thước chức năng (đếm số lượng các nút trong rừng) sẽ là:
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
Và chúng tôi nhận
# size_forest f1;;
- : int = 3