2011-10-27 19 views
14

Tôi muốn áp dụng hai (hoặc nhiều) biến vị ngữ cho một giá trị duy nhất. Ví dụ: giả sử tôi muốn kiểm tra xem một giá trị có phải là số nguyên dương không:Làm cách nào để bạn soạn hai hoặc nhiều vị từ trong clojure?

(defn posint? [n] 
    (and (integer? n) (pos? n))) 

Điều đó xảy ra, nhưng nếu tôi muốn áp dụng các biến vị ngữ? Tôi không muốn viết một hàm cho mỗi tổ hợp có thể có của các vị từ.

Trả lời

20

Trong Clojure 1.3 có thực sự là một chức năng built-in gọi every-pred làm chỉ này. Xem here.

(defn posint? [n] 
    ((every-pred integer? pos?) n)) 
+0

Điều này thậm chí xử lý '(posint?" A ")'! Tôi đang cần một giải pháp 1.2 mặc dù không may. – stand

+2

@stand: Tôi nghĩ, bạn có thể lấy hàm này từ các nguồn Clojure và đưa vào mã của bạn –

2

Nếu bạn đang tìm cách thực hiện các séc này nội dòng, những điều sau đây có thể là những gì bạn đang tìm kiếm.

(defn predicate-test [fns t] 
    "test all predicates against value t and return true iff all predicates return true." 
    (every? true? ((apply juxt fns) t))) 

(predicate-test [integer? pos?] 4) 

Sau đó bạn có thể tạo ra các phiên bản tên cho các bài kiểm tra ngữ sử dụng nhiều nhất của bạn:

(def posint? (partial predicate-test [integer? pos?]) 

(posint? 4) 
+0

Có, đó là chức năng 'juxt' mà tôi bị thiếu. Cảm ơn! – stand

+0

... mặc dù giải pháp này ném một ngoại lệ khi bạn thực hiện một '(posint?" A ")' vì 'pos?' Ném một 'CastException'. Tôi không thể nghĩ ra một cách để làm ngắn mạch đường 'và'. – stand

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