2011-08-11 29 views
2

在Clojure中有更好的方法吗?接受单数或集合的地图

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

将应用于输入collcoll可以是单数也可以是集合。

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

回答

4

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

但是,我建议这整段代码看起来像一个代码气味 - 它采取动态打字有点太远/试图有点太聪明在我看来:在“cleverness considered harmful”的意义上。

另类的想法来考虑:

  • 如果你真的想要把一切都像一个集合,然后再包奇输入值时,在长度为1的列表/矢量然后将剩下首先获得他们的代码可以安全地假设整个集合。
  • 编写单独的函数来处理集合和单个值。理由是它们在概念上是不同的数据类型,所以应该得到不同的处理。
1

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

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

没有通用的解决方案可以存在,因为可以是一个函数,它列出并返回列表。那么你不能以某种方式检查输入并决定是否映射它。

更好的办法是不要让自己陷入不知道自己的数据类型的情况,但如果不知道更多关于程序的信息,我无法给出任何具体建议。

+0

它实际上incanter.stats中的样板 –