Esiste un modo idiomatico per determinare se un LazySeq contiene un elemento? A partire dal Clojure 1,5 chiamare contains?
lancia un IllegalArgumentException:Clojure: il modo idiomatico da chiamare contiene? su una sequenza lenta
IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq
clojure.lang.RT.contains (RT.java:724)
Prima 1.5, per quanto ne so, è sempre restituito false.
So che chiamare su un LazySeq potrebbe non tornare mai in quanto può essere infinito. Ma cosa succede se so che non è e non mi interessa se viene valutato con entusiasmo?
Quello che mi è venuto in mente è:
(defn lazy-contains? [col key]
(not (empty? (filter #(= key %) col))))
Ma non si sente abbastanza di destra. C'è un modo migliore?
Il caso di avere nil come chiave lo rende un po 'scorretto. Ma dal momento che nel mio caso la chiave non è mai nulla, posso conviverci. – nansen
Giusto. Per risolvere il problema, usa semplicemente il tuo predicato originale: (alcuni # (= chiave%) col) – Chouser
@Chouser Ho cercato di implementare una di queste alternative a un uso specifico e ho riscontrato il seguente problema. Come otterrei questo per abbinare più strettamente l'originale contiene? funzionalità? (lazy-contiene? {: Stato "attivo",: corso_n "legge",: corso_i "C0"}: stato) restituisce nil ma quando si utilizza contiene? restituisce true Sto provando a digerire attraverso clojuredocs pure e non vedo come risolverlo. – RatavaWen