在Clojure中有更好的方法吗?接受单数或集合的地图
(if (coll? coll)
(map my-fn coll)
(my-fn coll)
将应用于输入coll
。 coll
可以是单数也可以是集合。
如果我不检查coll?
,单独使用map
会抛出IllegalArgumentException,因为不知道如何从xxx创建ISeq。
在Clojure中有更好的方法吗?接受单数或集合的地图
(if (coll? coll)
(map my-fn coll)
(my-fn coll)
将应用于输入coll
。 coll
可以是单数也可以是集合。
如果我不检查coll?
,单独使用map
会抛出IllegalArgumentException,因为不知道如何从xxx创建ISeq。
你的代码是好的(虽然我会重命名变量coll,因为你实际上不知道它是否是一个集合,这可能会使读者感到困惑)。
但是,我建议这整段代码看起来像一个代码气味 - 它采取动态打字有点太远/试图有点太聪明在我看来:在“cleverness considered harmful”的意义上。
另类的想法来考虑:
如果coll
不包含任何嵌套的序列:
(map my-fn (flatten (list coll)))
没有通用的解决方案可以存在,因为可以是一个函数,它列出并返回列表。那么你不能以某种方式检查输入并决定是否映射它。
更好的办法是不要让自己陷入不知道自己的数据类型的情况,但如果不知道更多关于程序的信息,我无法给出任何具体建议。
它实际上incanter.stats中的样板 –