Map 映射以接受单数或集合

Map 映射以接受单数或集合,map,clojure,Map,Clojure,在Clojure有更好的方法吗 (if (coll? coll) (map my-fn coll) (my-fn coll) my fn将应用于输入collcoll可以是单数,也可以是集合 如果我不检查coll?,单独使用map会引发一个非法的argumentException,因为我不知道如何从xxx创建ISeq。如果coll不包含任何嵌套序列: (map my-fn (flatten (list coll))) 不可能存在通用解决方案,因为my fn可能是一个获取列表并返回列表的

在Clojure有更好的方法吗

(if (coll? coll)
  (map my-fn coll)
  (my-fn coll)
my fn
将应用于输入
coll
coll
可以是单数,也可以是集合


如果我不检查
coll?
,单独使用
map
会引发一个非法的argumentException,因为我不知道如何从xxx创建ISeq。

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

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

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

最好不要让自己陷入不知道自己拥有什么类型的数据的情况,但在不了解更多程序的情况下,我不能给出任何具体的建议。

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

然而,我认为这整段代码看起来很可疑,就像一股代码气味——在我看来,动态键入有点太过分了/试图变得有点太聪明了:在“”的意义上

可考虑的备选方案:

  • 如果您确实希望将所有内容都视为一个集合,那么在长度为1的列表/向量中首次获得奇异输入值时,请将其包装起来。然后,代码的其余部分可以安全地在整个过程中假定集合
  • 编写单独的函数来处理集合和单个值。其基本原理是,它们在概念上是不同的数据类型,因此应得到不同的处理

它实际上是白炽灯中的样板