Clojure 有一个很好的函数,称为“partition”,它适用于序列。它将给定序列分解为等长列表的序列。第一个参数指定片段的长度。第二个参数是一个偏移量,它指定片段的下一个开始位置。
(partition 3 1 (range 5))
;;=> ((0 1 2) (1 2 3) (2 3 4))
(partition 4 6 (range 20))
;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15))
(partition 4 3 (range 20))
;;=> ((0 1 2 3) (3 4 5 6) (6 7 8 9) (9 10 11 12) (12 13 14 15) (15 16 17 18))
https://clojuredocs.org/clojure.core/partition
我正在寻找 F# 中的等效函数。显然 List.partition 还做了其他事情( https://msdn.microsoft.com/en-us/library/ee353782.aspx )。也许有一个库提供这样的功能?
最佳答案
在 F# 中,有两个类似的函数: windowed
这类似于 Clojure 的分区,但第二个参数固定为 1 和 chunkBySize
第二个参数等于第一个参数。
您可以将两者结合起来并获得所需的功能。这是一个列表示例:
let partition x y = List.windowed x >> List.chunkBySize y >> List.map List.head
它们也可用于数组和序列,但请注意,对于序列,内部集合将是一个数组,它实际上是一个序列。因此,如果您希望将结果严格推断为序列序列,则必须添加转换或向上转换:
let partition x y = Seq.windowed x >> Seq.chunkBySize y >> Seq.map (Seq.head >> seq)
关于clojure - F#:类似于 Clojure 中的分区函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35210382/