【发布时间】:2017-08-02 07:08:47
【问题描述】:
是否有表示“集合,但不是地图”的 Clojure 谓词?
这样的谓词是/将是有价值的,因为可以对除地图之外的所有集合执行许多操作。例如(apply + ...) 或(reduce + ...) 可以与向量、列表、惰性序列和集合一起使用,但不能与映射一起使用,因为在这样的上下文中映射的元素最终为clojure.lang.MapEntrys。我所知道的那些谓词导致问题的是集合和映射:
-
sequential?对于向量、列表和惰性序列是正确的,但对于映射和集合都是错误的。 (seq?类似,但对于向量来说是错误的。) -
coll?和seqable?适用于布景和地图,以及我能想到的所有其他类型的收藏。
当然我可以定义这样的谓词,例如像这样:
(defn coll-but-not-map?
[xs]
(and (coll? xs)
(not (map? xs))))
或者像这样:
(defn sequential-or-set?
[xs]
(or (sequential? xs)
(set? xs)))
我想知道是否有一个内置的 clojure.core(或贡献的库)谓词可以做同样的事情。
这个问题与this one 和this one 有关,但他们的回答没有回答。 (如果我的问题与我没有找到的问题重复,我很高兴将其标记为这样。)
【问题讨论】:
-
为什么你不知道你的函数得到什么数据结构? @Josh 用“否”回答了您的是/否问题,并提供了一些有用的建议。如果没有更多关于您正在尝试做的事情的背景信息,就很难为您提供帮助。尝试多种方法?
-
感谢@Brandon 的提问。我正在递归到一个映射映射(映射(映射......)),其中叶节点要么是非映射数字集合,要么是其他诸如裸数字之类的东西。我想计算每个数字集合的统计数据,但不是裸数字。目前叶子集合都是序列,但为什么不把函数做得更通用,让它处理集合呢?另请参阅我对 fl00r 答案的评论。
标签: clojure