Czy istnieje idiomatyczny sposób określania, czy LazySeq zawiera element? Począwszy od Clojure 1.5 nazywając contains?
rzuca IllegalArgumentException:Clojure: w jaki sposób wywoływać idiomatyczne połączenia? na leniwej sekwencji
IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq
clojure.lang.RT.contains (RT.java:724)
Przed 1.5, o ile mi wiadomo, to zawsze zwrócony fałszywe.
Wiem, że wywołanie contains?
na LazySeq może nigdy nie wrócić, ponieważ może być nieskończone. Ale co, jeśli wiem, że tak nie jest i nie obchodzi mnie, czy jest on oceniany z niecierpliwością?
Co wymyśliłem to:
(defn lazy-contains? [col key]
(not (empty? (filter #(= key %) col))))
Ale nie czuje się całkiem dobrze. Czy istnieje lepszy sposób?
Przypadek posiadania zer jako klucza powoduje, że jest on niepoprawny. Ale ponieważ w moim przypadku klucz nigdy nie jest zerowy, mogę z tym żyć. – nansen
Dobrze. Aby to naprawić, po prostu użyj oryginalnego predykatu: (niektóre # (= klucz%) col) – Chouser
@Chouser Próbowałem wdrożyć dowolne z tych alternatyw dla konkretnego zastosowania i wystąpił następujący problem. Jak mogę to lepiej dopasować do oryginału? funkcjonalność? (lazy-zawiera? {: Stan "aktywny",: course_n "prawo",: course_i "C0"}: stan) zwraca zero , ale gdy korzystanie zawiera? to zwraca true Próbuję również przeglądać clojuredocs i nie widzę jak to naprawić. – RatavaWen