Seq.fold 和布尔累加器

aka*_*nom 3 f#

我永远找不到 F# 核心库的源代码。我知道它应该是开放的,但谷歌在帮助我找到它时对我并不友好,如果是这样,我会查找 Seq.fold 的实现 - 但问题就在这里。

有没有人看到以下代码段有任何问题:

let success = myList |>
                    Seq.fold 
                        (fun acc item -> evaluation item)
                        false 
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,它似乎不保水,我可以并且将尝试对其进行测试。但我想问社区。如果 myList 中的任何单个评估返回 false,我希望成功变量为 false...


所以测试:

let myList = [true; true]
let success = List.fold (fun acc item -> acc && item) true myList
Run Code Online (Sandbox Code Playgroud)

let myList = [true; false; true]
let success = List.fold (fun acc item -> acc && item) true myList
Run Code Online (Sandbox Code Playgroud)

确实返回正确的结果 - 我只是看到源会更舒服......

Wes*_*ser 5

我认为你正在寻找的是这样的:

let success = myList |>
                    Seq.fold
                        (fun acc item -> acc && evaluation item)
                        true
Run Code Online (Sandbox Code Playgroud)

这也提供了“短路”评估,因此如果 accfalse来自先前的评估,evaluation item则不会运行并且表达式将简单地 return false

折叠运算符的 MSDN 文档

  • 它将使对“evaluation”的调用短路,但不会使列表其余部分的(无用)迭代短路。 (3认同)