F #: Seq.forall странность? - PullRequest
       23

F #: Seq.forall странность?

1 голос
/ 15 декабря 2011

Дано 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, тогда фактически ни один код в функции не выполняется, или что ??

Что происходит здесь?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

Вы используете значение "false", чтобы прекратить функцию Seq.forall при обработке других элементов.

Поскольку 1 % 2 = 0 равно false, оценка останавливается на первой итерации.

1 голос
/ 15 декабря 2011

Следующий подход будет более функциональным:

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 #, они, как правило, эффективны, если у вас нет особых требований.

...