2011-09-06 73 views
6

的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的許多資源,我想知道這是什麼慣用的方法。

回答

5

據我所知,實現類似這樣東西的「最佳」方法不是實現ISeq,而是clojure.lang.Seqable;換句話說,提供一個(.seq)的實現來將您的ResultSet映射到(可能是惰性的)序列。這就是clojure用於大多數(所有?)集合的路由,除了列表(列表實現ISeq,因爲seq API已經是列表API的一個子集)。

+0

這將允許我做一些事情,例如返回結果集中的底層行的序列,但它不允許我將函數映射到「結果」並獲取「結果」嗎?編輯:我剛剛意識到,內置的地圖不像這樣,也許我試圖做錯事。 –

+1

正如你在編輯中所說的那樣,clojure序列函數通常在提供的集合上調用(seq),然後處理並返回seq,而不是任何特定類型的集合。起初它似乎有點不直觀,但實際上它運作得非常好。所有你真正需要的是將seq轉換回你需要的集合類型,當你真的需要它的時候(這並不是很常見,一旦你在seqs上工作 - 可能值得考慮是否你甚至需要一個ResultSet類型) –

0

我想我誤解了你的問題,但不是你只是用map來爲你的結果中的每個元素應用一個函數。

相關問題