映射以接受单数或集合

时间:2011-08-11 16:20:36

标签: map clojure

在Clojure中有更好的方法吗?

(if (coll? coll)
  (map my-fn coll)
  (my-fn coll)

my-fn将应用于输入collcoll可以是单数或集合。

如果我不检查coll?,单独使用map将抛出IllegalArgumentException,因为不知道如何从xxx创建ISeq。

3 个答案:

答案 0 :(得分:4)

您的代码很好(虽然我重命名变量coll,因为您实际上并不知道它是否是一个集合,这可能会让读者感到困惑。)

但是我建议这整段代码看起来很像代码味道 - 它在动态类型上有点太过/在我看来试图有点过于聪明:在“cleverness considered harmful的意义上”

需要考虑的其他想法:

  • 如果你真的想把所有东西当作一个集合处理,那么当它们首先在长度为1的列表/向量中获取时,将它们包装成单个输入值。然后你的代码的其余部分可以安全地假设集合。
  • 编写单独的函数来处理集合和单个值。理由是它们在概念上是不同的数据类型,因此值得采取不同的处理方式。

答案 1 :(得分:1)

如果coll不包含任何嵌套序列:

(map my-fn (flatten (list coll)))

答案 2 :(得分:1)

不存在通用解决方案,因为my-fn可能是一个获取列表并返回列表的函数。然后你不能以某种方式检查输入并决定是否映射它。

最好不要让自己陷入不知道自己拥有什么类型数据的情况,但如果不了解您的计划,我无法就此提出任何具体建议。