clojure用于一次添加两个元素的序列压缩

clojure用于一次添加两个元素的序列压缩,clojure,Clojure,理解: (for [i (range 5])] i) 。。。收益率:(01 2 3 4) 是否有一种惯用的方法来获取(0 0 1 2 4 3 9 4 16)(即数字及其平方)主要使用进行理解 到目前为止,我找到的唯一方法是: (apply concat (for [i (range 5)] (list i (* i i)))) 我认为你做得对 使用展平 (flatten (for [i (range 5)] [ i (* i i) ] )) 但是为了理解,我会去掉,只使用交错 (let [

理解:

(for [i (range 5])] i)
。。。收益率:(01 2 3 4)

是否有一种惯用的方法来获取(0 0 1 2 4 3 9 4 16)(即数字及其平方)主要使用进行理解

到目前为止,我找到的唯一方法是:

(apply concat (for [i (range 5)] (list i (* i i))))

我认为你做得对

使用展平

(flatten (for [i (range 5)] [ i (* i i) ] ))
但是为了理解,我会去掉,只使用交错

(let [x (range 5)
      y (map #(* % %) x)]
  (interleave x y))

免责声明:我只是一名业余法学家;)

因为对于循环x次,它将返回x个值的集合。多个嵌套循环(除非受到
while
when
的限制)将给出x*y*z*。。。结果。这就是为什么外部连接总是必要的

map的输入和输出之间存在类似的相关性。但是,如果map中给定了多个集合,则返回集合中的值的数量是最小集合参数的大小

=> (map (juxt identity #(* % %)) (range 5))
([0 0] [1 1] [2 4] [3 9] [4 16])
连接map的结果是创建mapcat的常见方法。因此,有人可能会认为mapcat是一种更为惯用的循环方式

=> (mapcat (juxt identity #(* % %)) (range 5))
(0 0 1 1 2 4 3 9 4 16)
虽然这只是
apply concat(map
)的简写,但是可以同样轻松地创建
forcat
函数或宏

然而,如果需要对集合进行累加,则reduce通常被认为是最常用的方法

=> (reduce (fn [acc i] (conj acc i (* i i))) [] (range 5))
[0 0 1 1 2 4 3 9 4 16]
for
map
选项都意味着遍历集合两次,一次遍历范围,一次遍历结果集合。
reduce
选项仅遍历范围


关注分享为什么“使用主要用于理解”是一个要求?

< P>实际上,仅使用<>代码> 是非常简单的,如果您考虑将每个函数(标识和平方)应用于每个值。

(for [i (range 5),             ; for every value
      f [identity #(* % %)]]   ; for every function
  (f i))                       ; apply the function to the value

 ; => (0 0 1 1 2 4 3 9 4 16)

我只是想知道是否可以通过使用“for”的某些功能而不需要您所称的“外部连接”来实现它;但您明确表示这是必要的。等价地,
(对于[I(范围5),x[I(*I)]]x)