2016-08-10 20 views
5

Tôi bị bí ẩn bởi từ khóa and trong OCaml. Nhìn qua this code, tôi thấyTừ khóa `và` có nghĩa là gì trong OCaml?

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

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

sau đó later,

let rec debug stack env (r, ty) = (* a function definition *) 

and debugl stack env x = (* another function definition *) 

gì đang xảy ra ở đây? Từ khóa and chỉ sao chép câu hỏi type, let hoặc let rec cuối cùng? Có điều như tuyên bố and rec không? Tại sao tôi muốn sử dụng and thay vì chỉ cần nhập let hoặc type, làm cho mã của tôi ít giòn hơn để tái cấu trúc? Có điều gì khác mà tôi nên biết không?

Trả lời

13

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 treesforests 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 
Các vấn đề liên quan