f# - 如何停止遍历列表
问题描述
我从 Fsharp 开始,我有这个问题。假设我有两个长度相同的列表 a 和 b,我同时遍历这些列表,并在每个步骤中测试 a 和 b 的条件,并使用先前的微积分的结果。如果此测试失败,则无需继续。我写了这段代码:
let mutable (i : int) = 0
let mutable (good : bool) = true
let mutable (previous : int) = 0
while good && i < len do
good <- test a.[i] b.[i] previous
previous <- my_func a.[i] b.[i]
i <- i + 1
我看到这段代码要好得多:
List.zip a b |> List.fold (fun (x, y) (a,b) -> (p && test a b y, my_func a b) (true, 0)
但是,使用我的代码,一旦测试失败,该过程就完成了,而不是使用第二个代码。有没有办法,使用第二个代码的设计来停止这个过程?
谢谢
解决方案
我假设您只对最终结果是否为good
.
正如 Brian 所提到的,您可以使用Seq.scan
which 的行为类似于Seq.fold
但它返回所有中间状态而不仅仅是最终状态。通过使用Seq
而不是List
你也使用惰性序列,因此函数可以提前终止。为了做你想做的事,你可以使用Seq.scan
with Seq.forall
,它将检查给定序列的所有值是否满足特定条件 - 这里的好处是,一旦条件满足,它就可以提前终止false
。
把所有这些放在一起,我得到这样的东西:
Seq.zip a b
|> Seq.scan (fun (good, prev) (a, b) ->
test a b prev, my_func a b) (true, 0)
|> Seq.forall (fun (good, _) -> good)
推荐阅读
- elasticsearch - Elasticsearch 操作现有字段值以添加新字段
- node.js - 重新连接到 EventStore 中的持久连接后不重复确认的事件
- python - PHP 不执行 Python 文件
- java - 以平滑的外观更改 JButton 文本和背景颜色
- python - 在 1 个项目中运行 2 个 Discord 机器人 (Discord.py)
- c# - C# Modbus:ReadHoldingRegisters 在返回输出中不一致
- r - 使用 Tidyverse 将整数转换为 R 中的向量
- arrays - 对多个索引的元组数组进行排序,在 Julia 中只有一个反转
- rxjs - 如何在 rxjs 中执行“onErrorContinue”
- google-cloud-platform - GCP 本地云构建挂起