我在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的资源,我想知道对此有什么惯用方法。
答案 0 :(得分:5)
据我所知,实现这样的“最佳”方法不是实现ISeq,而是实现clojure.lang.Seqable;换句话说,提供(.seq)的实现来将ResultSet映射到(可能是惰性的)序列。这是路径clojure用于除列表之外的大多数(所有?)集合(列表实现ISeq,因为seq API已经是列表API的子集)。
答案 1 :(得分:0)
我认为我误解了你的问题,但你不会只使用map将函数应用于结果中的每个元素。