我应该在clojure中实现Seq接口

时间:2011-09-06 00:18:44

标签: functional-programming 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的资源,我想知道对此有什么惯用方法。

2 个答案:

答案 0 :(得分:5)

据我所知,实现这样的“最佳”方法不是实现ISeq,而是实现clojure.lang.Seqable;换句话说,提供(.seq)的实现来将ResultSet映射到(可能是惰性的)序列。这是路径clojure用于除列表之外的大多数(所有?)集合(列表实现ISeq,因为seq API已经是列表API的子集)。

答案 1 :(得分:0)

我认为我误解了你的问题,但你不会只使用map将函数应用于结果中的每个元素。