F#:分区函数就像Clojure中的那样

Ola*_*laf 4 f# clojure

Clojure有一个很好的函数叫做分区,它可以处理序列.它将给定的序列分成一系列同样长的列表.第一个参数指定fragaments的长度.第二个参数是一个偏移量,它指定片段的下一个开始.

(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))
Run Code Online (Sandbox Code Playgroud)

https://clojuredocs.org/clojure.core/partition

我正在寻找F#中的等效函数.显然,List.partition还有其他功能(https://msdn.microsoft.com/en-us/library/ee353782.aspx).也许有一个图书馆提供这样的功能?

Gus*_*Gus 7

在F#中你有两个相似的函数:windowed它们类似于Clojure的分区,但第二个参数固定为1 chunkBySize,第二个参数等于第一个参数.

您可以将两者结合起来并获得所需的功能.以下是列表的示例:

let partition x y = List.windowed x >> List.chunkBySize y >> List.map List.head
Run Code Online (Sandbox Code Playgroud)

它们也可用于数组和序列,但请注意,对于序列,内部集合将是一个数组,实际上是一个序列.因此,如果您希望将结果严格推断为序列序列,则必须添加转换或向上转换:

let partition x y = Seq.windowed x >> Seq.chunkBySize y >> Seq.map (Seq.head >> seq)
Run Code Online (Sandbox Code Playgroud)