f# - 为什么F#的Seq.windowed返回数组的seq

标签 f#

F#中的 Seq.windowed 返回一个序列,其中的每个窗口都是一个数组。为什么每个窗口都以数组(非常具体的类型)而不是另一个序列或 IList<'T> 的原因返回?例如,如果一个IList<'T>就足够了,目的是传达可以随机访问窗口的各项,但是数组表示两件事:元素是可变的并且可以随机访问。如果可以合理选择数组,windowed Seq.groupBy 有何不同?为何后者(或同一个运算符)也不会以数组的形式返回组的成员?

我想知道这仅仅是设计监督还是阵列的更深层次的契约(Contract)原因?

最佳答案

我不知道这背后的设计原则是什么。我想这可能只是实现的偶然方面-Seq.windowed可以通过将项目存储在数组中而很容易实现,而Seq.groupBy可能需要使用一些更复杂的结构。

通常,我认为如果使用array是自然有效的实现,F#API要么使用'T[],要么在数据源可能是无限的,惰性的,或者当实现必须将数据显式转换为数组时返回seq<'T>(然后可以留给调用者)。

对于Seq.windowed,我认为数组很有意义,因为您知道数组的长度,因此很可能使用索引。例如,假设prices是日期价格元组(seq<DateTime * float>)的序列,则可以编写:

prices
|> Seq.windowed 5
|> Seq.map (fun win -> fst (win.[2]), Seq.averageBy snd win)

该示例计算 float 平均值并使用索引来获取中间的日期。

总而言之,我对设计原理并没有很好的解释,但是我对所做的选择感到很满意-它们似乎可以正常使用这些功能。

关于f# - 为什么F#的Seq.windowed返回数组的seq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17563956/

相关文章:

list - 搜索元组列表 f#

compiler-errors - 使用 List.sum 时类型约束不匹配

f# - 在 F# 中写入 Excel

F# 无法捕获 DivideByZeroException

scala - 这个尾递归斐波那契函数的定义是尾递归的吗?

f# - 如何编写类型安全的递归内联函数来展平元组

F# 类型为 `and` 和 Lazy?

f# - 如何访问受歧视联合元组中的项目?

.net - 什么是 Scala 的 Seq.Span 在 F# 中的等价物?

f# - -> Clojure 中的运算符