gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:43:17 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com