1

给定let ra = ResizeArray<int> ()

Seq.forall (fun i ->
                    let q = i % 2
                    if 0 = q then ra.Add i
                    true ) <| seq { 1..10 }

如果我这样做,ra.Count返回5.

Seq.forall (fun i ->
                    let q = i % 2
                    if 0 = q then ra.Add i
                    0 = q ) <| seq { 1..10 }

如果我这样做,ra.Count返回0.

那么,除非 lambda 函数的每次迭代都计算为 true,否则函数中的任何代码都不会被执行,还是什么?

这里发生了什么?

4

2 回答 2

5

您使用“false”值来停止Seq.forall函数处理更多元素。

由于1 % 2 = 0是假的,这将停止第一次迭代的评估。

于 2011-12-14T20:16:45.733 回答
1

以下方法将更实用:

let (anyOdds, evens) =
    seq {1..10}
    |> Seq.fold (fun (anyOdds, xs) x ->
        if x % 2 = 0 then
            anyOdds, x :: xs
        else true, xs) (false, [])

放弃 ResizeArray 转而使用 F# 列表感觉很舒服,除非您有特定要求,否则它们通常是有效的。

于 2011-12-14T23:42:07.347 回答