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!
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
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. –
@ 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ị. –