在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
是惰性的。在这种特殊情况下,所有数据都会被消耗掉。当然,你是对的。也看看谢谢你的链接!我还在仔细考虑我的想法。它确实提出了正确的观点。