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

では、ラムダ関数のすべての反復が true と評価されない限り、関数内のコードは実質的に実行されません。

何が起きてる?

4

2 に答える 2

5

Seq.forall関数がそれ以上要素を処理しないようにするには、「false」の値を使用します。

1 % 2 = 0は false であるため、これは最初の反復で評価を停止します。

于 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, [])

特定の要件がない限り、F# リストは一般的に効率的です。

于 2011-12-14T23:42:07.347 に答える