2009-09-15 37 views
7

Nếu tôi có đối tượng, làm cách nào để xác định loại đối tượng? (Có một OCaml tương đương với toán tử instanceof của Java không?)OCaml: Loại đối tượng kiểm tra

+0

bạn có thể đăng một số mã không, vì thông thường bạn biết loại đối tượng khi bạn đang xử lý nó – 0xFF

Trả lời

7

OCaml có kiểu nhập cấu trúc cho các đối tượng chứ không phải gõ đánh máy như trong Java. Vì vậy, loại đối tượng cơ bản được xác định (và chỉ được xác định) bằng các phương pháp của nó. Các đối tượng trong OCaml có thể được tạo trực tiếp, mà không phải trải qua một thứ gì đó giống như một lớp.

Bạn có thể viết các hàm yêu cầu đối tượng đối số của nó có các phương thức nhất định (và các phương thức đó có các kiểu nhất định); ví dụ: phương thức sau có một đối số là bất kỳ đối tượng nào có phương thức "bar":

let foo x = x#bar 
4

Có một cuộc thảo luận về "Matching Objects With Patterns" trên Lambda the Ultimate (giấy sử dụng Scala làm ngôn ngữ, vì vậy sẽ không trả lời câu hỏi của bạn). Một liên quan hơn Ocaml mailing list thread cho biết rằng không có RTTI/an toàn-downcasting cho các đối tượng.

Đối với đại số (không đối tượng) các loại bạn rõ ràng có:

match expr with 
    Type1 x -> x 
    Type2 (x,y) -> y 

gọi (pattern) matching

Có người đã viết một extension cho phép down/up-đúc tượng Ocaml.

+0

Tôi đang gặp khó khăn trong việc làm việc này. Tôi đã thực hiện khớp mẫu cho các giá trị trong một loại nhưng không khớp với nhiều giá trị. –

+0

Có sự khác biệt giữa các đối tượng và các loại đại số. Hầu hết mọi người dường như thích để tránh các đối tượng của Ocaml và sử dụng functors + các loại đại số cho genericity. –

1

Tóm lại, bạn phải mã hóa cơ chế RTTI của riêng mình. OCaml cung cấp không có RTTI hoặc lên/xuống đúc (sau này một phần vì thừa kế và subtyping là trực giao trong OCaml hơn là thống nhất như trong Java).

Bạn có thể làm điều gì đó bằng chuỗi hoặc biến thể đa hình để mã hóa thông tin loại trong lớp và đối tượng của bạn. Tôi tin rằng LablGTK thực hiện một số điều này, và cung cấp một thư viện tiện ích để hỗ trợ việc gắn thẻ đối tượng và lên/xuống.

0

Hơi lệch chủ đề, nhưng the OPA language (được vẽ nhiều từ một số khía cạnh của OCaml), cho phép tương đương với đối sánh mẫu trên các đối tượng. Vì vậy, nó khá khả thi.

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