2011-12-18 14 views
7

Tôi đang chuyển từ Haskell sang OCaml nhưng tôi đang gặp một số sự cố. Ví dụ, tôi cần định nghĩa kiểu cho các biểu thức chính quy. Tôi làm như vậy với:OCaml: độ tròn giữa loại biến thể và định nghĩa mô-đun

type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) ;; 

Các yếu tố bên trong Hoặc nằm trong một nhóm (RegExpSet), vì vậy tôi xác định nó bên cạnh (và cũng là một chức năng bản đồ):

module RegExpOrder : Set.OrderedType = 
    struct 
     let compare = Pervasives.compare 
     type t = re 
    end 
module RegExpSet = Set.Make(RegExpOrder)  
module RegExpMap = Map.Make(RegExpOrder) 

Tuy nhiên, khi tôi làm "ocaml [name of file]" Tôi nhận được:

Error: Unbound module RegExpSet 

trong dòng "Hoặc" trong định nghĩa "re".

Nếu tôi trao đổi những định nghĩa này, có nghĩa là, nếu tôi viết các định nghĩa module trước khi định nghĩa kiểu tái Tôi rõ ràng là nhận được:

Error: Unbound type constructor re 

trong dòng "type = t lại".

Tôi làm cách nào để giải quyết vấn đề này? Cảm ơn!

Trả lời

9

Bạn có thể thử sử dụng recursive modules. Ví dụ: các biên dịch sau:

module rec M : 
sig type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) 
end = 
struct 
    type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) ;; 
end 

and RegExpOrder : Set.OrderedType = 
    struct 
     let compare = Pervasives.compare 
     type t = M.re 
    end 
and RegExpSet : (Set.S with type elt = M.re) = Set.Make(RegExpOrder) 
+0

Cảm ơn bạn đã trả lời! Tôi đã thêm định nghĩa đó vào đầu tệp của tôi. Tuy nhiên bây giờ tôi có một vấn đề mới, đó là khi tôi cố gắng kết hợp các đối số của một hàm với các phần tử của loại M.re. Ví dụ: chức năng này để lf exp = điểm đến phù hợp với \t M.EmptyWord -> M.EmptySet ;; mang lại cho tôi Lỗi: constructor Unbound M.EmptyWord Ricardo Almeida – vegetus

+0

Việc thực hiện các loại 're' đã được thực hiện trừu tượng. Hãy thử xóa chữ ký mô-đun 'sig type re end'. Ngoài ra, hãy xem xét các loại 'private', cho phép mức ẩn trung gian; bên ngoài module, bạn sẽ phải sử dụng các hàm tạo đặc biệt để lấy các giá trị kiểu 're', nhưng bạn vẫn có thể khớp mẫu. –

+0

@ user1104586 Tôi đã cập nhật câu trả lời của mình để làm cho các hàm tạo của 'M.re' hiển thị. –

Các vấn đề liên quan