在clojure中将单曲和列表放入列表

在clojure中将单曲和列表放入列表,clojure,Clojure,有没有一种比下面的(公认的糟糕)功能更优雅的方式让处理单个项目和列表 (defn into-1-or-more [this-list list-or-single] (into this-list (flatten (conj [] list-or-single)))) 它可以处理以下两种情况之一: (into-1-or-more [1 2 3 4] 5) ;[1 2 3 4 5] 或: 我正在使用reduce将一个集合使用构建为[],其中包含列表中函数的结果。但是,一些函数返回单个

有没有一种比下面的(公认的糟糕)功能更优雅的方式让
处理单个项目和列表

(defn into-1-or-more
  [this-list list-or-single]
  (into this-list (flatten (conj [] list-or-single))))
它可以处理以下两种情况之一:

(into-1-or-more [1 2 3 4] 5)
;[1 2 3 4 5]
或:

我正在使用reduce将一个集合使用
构建为[]
,其中包含列表中函数的结果。但是,一些函数返回单个项,而另一些函数返回项列表。比如:

(reduce #(into [] (% data)) [func-return-item func-return-list func-return-either])
最好的解决办法是只做以下事情吗

(into [] (flatten (map #(% data) [func-return-item ...])

虽然更理想的做法是确定您获得的回报类型,但这里有一个简单的答案:

(flatten [ curr-list (mystery-fn) ] )
示例:

(flatten [[1 2 3] 9 ] )
;=> (1 2 3 9)
(flatten [[[1] 2 3] [4 5] 6 ] )
;=> (1 2 3 4 5 6)

如果您愿意,您可以将其包装成函数,但这似乎不是必需的

虽然更理想的做法是确定您获得的回报类型,但这里有一个简单的答案:

(flatten [ curr-list (mystery-fn) ] )
示例:

(flatten [[1 2 3] 9 ] )
;=> (1 2 3 9)
(flatten [[[1] 2 3] [4 5] 6 ] )
;=> (1 2 3 4 5 6)

如果您愿意,您可以将其包装成函数,但这似乎不是必需的

此传感器将顺序输入展平,但仅展平一个“电平”:

例如:

(into [] maybe-cat [[:foo] :bar [[:quux]]])
;= [:foo :bar [:quux]]

如本例所示,这种方法可以在输出中包含顺序集合(通过将它们包装在附加的顺序层中–
[:qux]]在输出中产生
[:qux]
)。

此传感器将顺序输入展平,但仅为一个“级别”:

例如:

(into [] maybe-cat [[:foo] :bar [[:quux]]])
;= [:foo :bar [:quux]]

如本例所示,这种方法可以在输出中包含顺序集合(通过将它们包装在附加的顺序层中–reduce在输出中产生
[:qux]

我会避免使用
reduce
,如果没有必要,
reduce
并不懒惰,
map
是。在这种特殊情况下,所有数据都会被消耗掉。当然,你是对的。也看看谢谢你的链接!我还在仔细考虑我的想法。它确实提出了一些有效的观点。如果没有必要,我会避免使用
reduce
reduce
不是惰性的,
map
是惰性的。在这种特殊情况下,所有数据都会被消耗掉。当然,你是对的。也看看谢谢你的链接!我还在仔细考虑我的想法。它确实提出了正确的观点。