2014-05-03 21 views
8

uczę Clojure i widziałem ten kawałek kodu Online:Clojure Podstawy: liczenie częstotliwości

(count (filter #{42} coll)) 

i robi, jak stwierdzono, liczba wystąpień liczby 42 w Coll. Czy #{42} jest funkcją? Dokumentacja Clojure na filtrze mówi, że tak powinno być, ponieważ opis działa tak, jak jest reklamowany. Po prostu nie mam pojęcia, jak to działa. Gdyby ktoś mógł to dla mnie wyjaśnić, byłoby wspaniale. Moje własne rozwiązanie tego samego byłby:

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

Dlaczego mój funkcji filtrowania ma nawiasu i fragment znalazłem online ma nawiasów klamrowych wokół funkcji filtrowania (#(...) vs. #{...})?

+0

Czy widziałaś tę odpowiedź? http://stackoverflow.com/questions/3249334/test-whether-a-list-contains-a-specific-value-in-clojure – Jonas

+0

Nie, nie widziałem tej odpowiedzi. Widzę, że używają podobnych fragmentów kodu. Wspomina się również, że '(# {x} x)' zwraca 'x'. Po prostu nie rozumiem, co robi funkcja # # xx} jako funkcja. Czy to nie tylko zestaw? – vim

+0

Zobacz moją odpowiedź. Zestaw to nie tylko zestaw - między innymi to IFn, więc możesz traktować go jako funkcję. – pete23

Odpowiedz

16
=> #{42} 
#{42} 

Definiuje zestaw ...

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

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

ciekawe zestaw realizuje IFN tak można traktować jak funkcję. Zachowanie funkcji to "jeśli ten element istnieje w zestawie, zwróć go".

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

Inne kolekcje, takie jak mapa i wektor, działają jak funkcje w podobny sposób, pobierając odpowiednio według klucza lub indeksu.

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

Słodki, nie? :-)

1

Tak, #{42} jest funkcją,

  • , ponieważ jest to zestaw i zestawów, wśród innych możliwości, są funkcje: oni implementować interfejs clojure.lang.IFn.
  • Stosowane do dowolnej wartości w zestawie, zwracają ją; zastosowane do czegokolwiek innego, w przeciwnym razie zwracają nil.
  • Tak więc #{42} sprawdza, czy jego argumentem jest 42 (tylko nil i false są fałszywe, pamiętaj).

Clojure sposobem jest, aby wszystko to funkcja, która może z powodzeniem być jeden:

  • Zestawy pracy jako test dla członkostwa.
  • Mapy działają jako klucz wyszukiwania.
  • Wektory działają jako odnośniki indeksu.
  • Słowa kluczowe działają jako odnośnik w argumencie mapy.

Ten

  • często oszczędza get,
  • pozwala, jak w pytaniu, aby przejść nago struktur danych, aby funkcja wyższego rzędu takich jak filter i map i
  • w przypadku słów kluczowych umożliwia przezroczyste przenoszenie między mapami i zapisami do przechowywania danych.