2011-09-06 11 views
6

Mam strukturę danych w Clojure, która reprezentuje zestaw wyników z eksperymentu:Mam zaimplementować interfejs Seq w Clojure

(defprotocol ResultSet 
    (columns [rs] "return a collection of the columns in the resultset, represented by keywords") 
    (rows [rs] [rs column-keys] "returns a seq of the rows in the resultset, order and column specified as keywords by column-keys. with a single argument returns rows with all columns present")) 

I mam deftype który implementuje ten protokół. Interesuje mnie pisanie funkcji, które robią takie rzeczy jak odwzorowywanie funkcji na wszystkie wyniki w zestawie wynikowym, lub które składają się na zestaw wyników, zasadniczo robiąc to samo, co wbudowane funkcje seq.

W Haskell zrobiłbym to poprzez wprowadzenie odpowiednich typeclasses (np. Functor), a następnie za pomocą funkcji takich jak fmap lub mfilter. Spojrzałem więc na to w Clojure i nakręciłem kilka pomysłów na temat implementacji interfejsu ISeq.

Czy to dobry pomysł? Nie mogę znaleźć wielu zasobów na temat wdrażania ISeq i zastanawiam się, co to jest idiomatyczne podejście.

Odpowiedz

5

O ile mogę powiedzieć, "najlepszym" sposobem realizacji czegoś takiego nie jest wdrożenie ISeq, ale clojure.lang.Seqable; innymi słowy, zapewnij implementację (.seq), aby zmapować zestaw wyników na (prawdopodobnie leniwą) sekwencję. To jest ścieżka, którą clojure używa dla większości (wszystkich?) Kolekcji z wyjątkiem listy (listuje implementację ISeq, ponieważ seq API jest już podzbiorem listy API).

+0

To pozwoli mi na zrobienie czegoś takiego, jak zwrócenie podstawowej sekwencji wierszy w zestawie wynikowym, ale nie pozwala mi ona odwzorować funkcji na 'Wyniki' i odzyskać' Wyniki' to robi? EDIT: Właśnie sobie sprawę, że wbudowana mapa nie zachowuje się tak, być może próbuję zrobić coś niewłaściwego. –

+1

Tak jak mówisz w swojej edycji, funkcje sekwencji clojure zwykle wywołują (seq) w podanej kolekcji, a następnie pracują i zwracają seqy, a nie określony typ kolekcji. Na początku wydaje się nieco nieintuicyjny, ale w praktyce działa naprawdę dobrze. Wszystko, czego naprawdę potrzebujesz, to jakiś sposób przekształcenia seq z powrotem w potrzebny typ kolekcji, kiedy naprawdę tego potrzebujesz (co nie jest tak często, gdy pracujesz nad sekcjami - warto zastanowić się, czy potrzebujesz typ zestawu wyników w ogóle) –

0

Myślę, że nie rozumiem pańskiego pytania, ale nie użyłbyś mapy do zastosowania funkcji do każdego elementu w twoim wyniku.

Powiązane problemy