Có cách nào để xác định liệu một LazySeq có chứa một phần tử không? Tính đến Clojure 1,5 gọi contains?
ném một IllegalArgumentException:Clojure: Cách thành ngữ để gọi có chứa? trên một trình tự lười biếng
IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq
clojure.lang.RT.contains (RT.java:724)
Trước 1.5, như xa như tôi biết, nó luôn được trả về sai.
Tôi biết rằng gọi contains?
trên LazySeq có thể không bao giờ trở lại vì nó có thể là vô hạn. Nhưng nếu tôi biết nó không phải là và không quan tâm nếu nó được đánh giá háo hức?
Những gì tôi đã đưa ra là:
(defn lazy-contains? [col key]
(not (empty? (filter #(= key %) col))))
Nhưng nó không cảm thấy hoàn toàn đúng. Có cách nào tốt hơn?
Trường hợp có nil là khóa làm cho nó có phần không chính xác. Nhưng vì trong trường hợp của tôi chìa khóa không bao giờ là nil tôi có thể sống với nó. – nansen
Phải. Để khắc phục điều đó, chỉ cần sử dụng biến vị ngữ ban đầu của bạn: (một số # (= key%) col) – Chouser
@Chouser Tôi đã cố gắng triển khai bất kỳ lựa chọn thay thế nào cho một mục đích cụ thể và đã chạy vào vấn đề sau. Làm thế nào tôi sẽ nhận được điều này để phù hợp hơn với bản gốc có chứa? chức năng? (lười biếng chứa? {: Trạng thái "hoạt động",: course_n "law",: course_i "C0"}: trạng thái) trả về nil nhưng khi sử dụng có chứa? nó trả về true Tôi đang cố gắng để grok thông qua clojuredocs là tốt và không thấy làm thế nào để sửa chữa nó. – RatavaWen