У меня есть структура данных в 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 и мне интересно, каков идиоматический подход к этому.