Должен ли я реализовать интерфейс Seq в clojure - PullRequest
6 голосов
/ 06 сентября 2011

У меня есть структура данных в 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"))

И у меня есть deftype, который реализует этот протокол. Я заинтересован в написании функций, которые делают такие вещи, как отображение функции на все результаты в наборе результатов, или которые сворачивают набор результатов, в основном делая те же вещи, что и встроенные функции seq.

В Haskell я бы сделал это путем реализации соответствующих классов типов (например, Functor), а затем использовал бы такие функции, как fmap или mfilter. Поэтому я решил заняться этим в Clojure и получил некоторые идеи по реализации интерфейса ISeq.

Итак, это хорошая идея? Я не могу найти много ресурсов о реализации ISeq и мне интересно, каков идиоматический подход к этому.

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

Насколько я могу судить, "лучший" способ реализовать что-то подобное - это не реализовать ISeq, а clojure.lang.Seqable; другими словами, предоставьте реализацию (.seq) для сопоставления вашего ResultSet с (возможно, ленивой) последовательностью. То есть маршрут, используемый clojure для большинства (всех?) Коллекций, кроме списка (списки реализуют ISeq, поскольку API seq уже является подмножеством API списка).

0 голосов
/ 07 сентября 2011

Я думаю, что я неправильно понимаю ваш вопрос, но разве вы не использовали бы карту, чтобы применить функцию к каждому элементу в вашем результате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...