首页 > 解决方案 > 如何停止遍历列表

问题描述

我从 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)

但是,使用我的代码,一旦测试失败,该过程就完成了,而不是使用第二个代码。有没有办法,使用第二个代码的设计来停止这个过程?

谢谢

标签: f#

解决方案


我假设您只对最终结果是否为good.

正如 Brian 所提到的,您可以使用Seq.scanwhich 的行为类似于Seq.fold但它返回所有中间状态而不仅仅是最终状态。通过使用Seq而不是List你也使用惰性序列,因此函数可以提前终止。为了做你想做的事,你可以使用Seq.scanwith 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)

推荐阅读