问题标签 [seq.unfold]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6023 浏览

f# - F# 中的 Seq.unfold 解释

我正在尝试使用 F# 懒惰地创建一个序列。

序列定义如下:

三角形数列的第 n 项由下式给出, tn = ½n(n+1);所以前十个三角形数是:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

这是我到目前为止所拥有的,但它似乎不起作用:

非常感谢谁能帮我弄清楚展开的工作原理。谢谢

编辑:我将第一个答案标记为正确,但它不起作用,但是我稍微修改了它并且它起作用了。

0 投票
2 回答
4285 浏览

performance - 为什么在此示例中使用序列比使用列表慢得多

背景:我有一系列连续的带时间戳的数据。数据序列中有漏洞,有的很大,有的只是一个缺失值。
每当孔只是一个缺失值时,我想使用虚拟值修补孔(将忽略较大的孔)。

我想使用修补序列的延迟生成,因此我使用 Seq.unfold。

我已经制作了两个版本的方法来修补数据中的漏洞。

第一个使用带有漏洞的数据序列并生成修补序列。这就是我想要的,但是当输入序列中的元素数量超过 1000 时,这些方法的运行速度非常慢,并且输入序列包含的元素越多,情况就会变得越糟。

第二种方法使用带有漏洞的数据列表并生成修补后的序列,并且运行速度很快。然而,这不是我想要的,因为这会强制在内存中实例化整个输入列表。

我想使用 (sequence -> sequence) 方法而不是 (list -> sequence) 方法,以避免将整个输入列表同时放在内存中。

问题:

1)为什么第一种方法这么慢(随着更大的输入列表变得越来越糟)(我怀疑它与使用 Seq.skip 1 重复创建新序列有关,但我不确定)

2)如何在使用输入序列而不是输入列表的同时快速修补数据中的漏洞?

编码:

0 投票
3 回答
406 浏览

f# - 在 F# 中,如何在较大管道的上下文中使用 Seq.unfold?

我有一个包含两列文本和计数的 CSV 文件。目标是从此文件转换:

对此:

重复每行计数次数并将计数分布在那么多行上。

在我看来,这似乎是 Seq.unfold 的一个很好的候选者,在我们读取文件时会生成额外的行。我有以下生成器功能:

FSI 产生以下函数签名:

在 FSI 中执行以下操作:

产生预期的:

问题是:如何将其插入更大的 ETL 管道的上下文中?例如:

下面的错误出现在管道上下文中的 expandRows 上。

我期待 expandRows 返回字符串的序列,就像在我的独立测试中一样。由于这既不是“期望”也不是“给定”,我很困惑。有人可以指出我正确的方向吗?

代码要点在这里: https ://gist.github.com/akucheck/e0ff316e516063e6db224ab116501498