【发布时间】:2014-06-15 13:33:48
【问题描述】:
在 clojure 中,我想从一个大的惰性序列(可能是一个无限的)中计算几个子向量。 天真的方法是将惰性序列转换为向量,然后计算子向量。但是这样做时,我就失去了懒惰。
我有一个大序列big-sequence 和positions,一个开始和结束位置的列表。我想做以下计算,但 懒惰:
(let [positions '((5 7) (8 12) (18 27) (28 37) (44 47))
big-sequence-in-vec (vec big-sequence)]
(map #(subvec big-sequence-in-vec (first %) (second %)) positions))
; ([5 6] [8 9 10 11] [18 19 20 21 22 23 24 25 26] [28 29 30 31 32 33 34 35 36] [44 45 46])
可行吗?
备注:如果big-sequence 是无限的,vec 将永远不会返回!
【问题讨论】:
-
positions是否像您的代码片段中一样是固定列表?如果是这样,您可以在 subvec 调用中使用(vec (take n big-sequence)),在这种情况下 n = 47。 -
@RandyHudson 它将解决无限序列的问题,但不会保持懒惰。
-
map本身就是懒惰的,所以如果你只想要一些结果,那么大序列只能实现到需要的位置。此外,takeing 某些元素不会强制实现整个序列。 -
子向量总是排序的吗?它们在示例中。正如@omiel 指出的那样,我在我的解决方案中已经假设了。