F#:Seq.forall奇怪吗?

时间:2011-12-14 20:09:18

标签: f# seq

鉴于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,否则实际上函数中没有任何代码被执行,或者什么?

这是怎么回事?

2 个答案:

答案 0 :(得分:5)

使用值“false”来停止Seq.forall函数处理其他元素。

由于1 % 2 = 0为false,因此会在第一次迭代时停止评估。

答案 1 :(得分: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#列表感觉很舒服,除非您有特殊要求,否则它们通常都很有效。