clojure - F#:类似于 Clojure 中的分区函数

标签 clojure f#

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/

相关文章:

clojure 映射集 - 基本过滤

Haskell 性能 : Composition vs Application?

xml - F# XML 类型提供程序公共(public)元素

clojure - 当 Clojure promise 实现或失败时,如何听取它?

clojure - 使用 test.check 生成结构化映射

Clojure记录构造函数不是一流的?

syntax - 可以使用 Clojure/Lisp 宏来实现此 lambda 语法吗?

oop - 如何在函数式编程中建模继承关系

.net - F#-解析日期

f# - 在没有 SQL 类型提供程序的情况下连接到 SQL 数据库?