的SEQ接口I有Clojure中的數據結構,其表示從實驗一組結果:我應該實現用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的許多資源,我想知道這是什麼慣用的方法。
這將允許我做一些事情,例如返回結果集中的底層行的序列,但它不允許我將函數映射到「結果」並獲取「結果」嗎?編輯:我剛剛意識到,內置的地圖不像這樣,也許我試圖做錯事。 –
正如你在編輯中所說的那樣,clojure序列函數通常在提供的集合上調用(seq),然後處理並返回seq,而不是任何特定類型的集合。起初它似乎有點不直觀,但實際上它運作得非常好。所有你真正需要的是將seq轉換回你需要的集合類型,當你真的需要它的時候(這並不是很常見,一旦你在seqs上工作 - 可能值得考慮是否你甚至需要一個ResultSet類型) –