2014-05-03 10 views
8

sto imparando Clojure, e ho visto questo pezzo di codice in linea:Clojure principi fondamentali: il conteggio frequenze

(count (filter #{42} coll)) 

E lo fa, come detto, contare le occorrenze del numero 42 in coll. #{42} è una funzione? La documentazione Clojure sul filtro dice che dovrebbe essere, dal momento che lo snippet funziona come pubblicizzato. Non ho idea di come funzioni. Se qualcuno potesse chiarire questo per me, sarebbe fantastico. La mia soluzione a questo stessa cosa sarebbe stata:

(count (filter #(= %1 42) coll)) 

Come mai la mia funzione di filtro ha parentesi e il frammento di che ho trovato on-line ha parentesi graffe intorno alla funzione di filtraggio (#(...) vs. #{...})?

+0

Hai visto questa risposta? http://stackoverflow.com/questions/3249334/test-whether-a-list-taintain-a-specific-value-in-clojure – Jonas

+0

No, non ho visto quella risposta. Posso vedere che stanno anche usando bit di codice simili. C'è anche menzione che '(# {x} x)' restituisce 'x'. Semplicemente non capisco cosa sta facendo '# {x}' come una funzione. Non è solo un set? – vim

+0

Vedi la mia risposta. Un set non è solo un set - tra le altre cose è un IFn quindi puoi trattarlo come una funzione. – pete23

risposta

16
=> #{42} 
#{42} 

definisce un insieme ...

=> (type #{42}) 
clojure.lang.PersistentHashSet 

=> (supers (type #{42})) 
#{clojure.lang.IHashEq java.lang.Object clojure.lang.IFn ...} 

È interessante notare che il set implementa IFN in modo da poter trattare come una funzione. Il comportamento della funzione è "se questo elemento esiste nel set, restituirlo".

=> (#{2 3} 3) 
3 
=> (#{2 3} 4) 
nil 

Altre collezioni come mappa e il vettore di stare in come funzioni in modo simile, recuperato dalla chiave o indice come appropriato.

=> ({:x 23 :y 26} :y) 
26 
=> ([5 7 9] 1) 
7 

Dolce, no? :-)

1

Sì, #{42} è una funzione,

  • perché è un set, e set, tra le altre funzionalità, sono funzioni: implementano l'interfaccia clojure.lang.IFn.
  • Applicati a qualsiasi valore nel set, lo restituiscono; applicato a qualsiasi cosa altro, restituiscono nil.
  • Quindi #{42} verifica se il suo argomento è 42 (solo nil e false sono false, ricordare).

Il modo Clojure è quello di rendere il tutto una funzione che potrebbe utilmente essere uno:

  • Imposta lavoro come un test per l'adesione.
  • Mappe funzionano come ricerca chiave.
  • I vettori funzionano come indicizzazione.
  • Le parole chiave funzionano come ricerca nell'argomento della mappa.

Questo

  • spesso puoi risparmiare un get,
  • consente, come nella questione, per passare strutture dati nudi per funzioni di ordine superiore come ad esempio filter e map, e
  • nel caso di parole chiave, consente di spostarsi in modo trasparente tra mappe e record per contenere i propri dati.
Problemi correlati