2010-08-22 23 views

Trả lời

9

Vâng, thực tế có một số thư viện khớp mẫu được viết cho Clojure. Các macro của Clojure có thể làm được điều này. Matchure là một trong những lần gần đây nhất. Thậm chí còn có một số thứ cho ADTs in contrib.

Bỏ qua những thứ đó, điều gần nhất chúng ta có với ADT của Haskell trong lõi Clojure là các bản ghi và kiểu dữ liệu mới trong Clojure 1.2. Tuy nhiên, trừ khi bạn cần những lợi ích đến từ việc sử dụng một bản ghi hoặc datatype, bạn sẽ thường chỉ sử dụng một bản đồ. Clojure là một ngôn ngữ động, vì vậy bạn sẽ không nhận được kiểm tra kiểu tĩnh nếu bạn sử dụng một bản ghi và như vậy anyway.

Clojure có "phá hoại", gợi nhớ về kết hợp mẫu và được sử dụng rất nhiều trong Clojure thành ngữ. Xem thisthis. Trước đây là câu trả lời của bạn thực sự ở đây trên SO. ; P

1

Look để matchure thư viện - nó cần được đưa vào clojure-contrib trong gần thời gian

0

Tôi thích bla rất nhiều như là một phù hợp với thư viện mẫu.

Thực tế để có cả từ khóa lẫn biểu tượng giúp triển khai biến thể khá dễ dàng trên cùng thư viện khớp mẫu.

3

Nó phụ thuộc một chút vào những gì bạn đang cố gắng làm. Nhưng giả sử trường hợp chung của muốn hành vi đa hình dựa trên kiểu dữ liệu, các giao thức thường là một cách tiếp cận tốt:

(defprotocol Fooable 
    (foo [x])) 

(defrecord AType [avalue] 
    Fooable 
    (foo [x] 
     (println (str "A value: " (:avalue x))))) 

(defrecord BType [avalue] 
    Fooable 
    (foo [x] 
     (println (str "B value: " (:bvalue x))))) 

(foo (AType. "AAAAAA"))  
=> A value: AAAAAA 

(foo (BType. "BBBBBB"))  
=> B value: BBBBBB 

Trong bối cảnh này, các giao thức có hiệu quả xác định tập hợp các hoạt động mà bạn muốn trên ADT của bạn, và các hồ sơ xác định các giá trị có thể có của ADT cũng như hành vi đa hình cho các hàm giao thức.