Разница между Seq и Array для значения массива - PullRequest
3 голосов
/ 24 сентября 2010

Я совсем новичок в F #.

Я полагаю, что массивы все еще являются коллекциями, поэтому я мог бы использовать Seq для итерации массива следующим образом:

[|"a"; "b"|] |> Seq.map (fun f -> printfn "a") |> ignore;;

Но это не работает - ничего не печатает. С другой стороны, если я использую Array, он печатает строки:

[|"a"; "b"|] |> Array.map (fun f -> printfn "a") |> ignore;;

Почему это?

Ответы [ 2 ]

7 голосов
/ 24 сентября 2010

Array.map создает другой массив - это означает, что он должен делать это с нетерпением.Вы не можете создать массив и сказать: «Я заполню значения, когда вы захотите их».

Последовательности, с другой стороны, оцениваются лениво ... это толькокогда вы запрашиваете значения в последовательности результатов, сопоставление будет оценено.Как указано в документации для Seq.map:

Данная функция будет применяться, поскольку элементы запрашиваются с помощью метода MoveNext для перечислителей, извлекаемых из объекта.

Если вы знакомы с LINQ, это в основном разница между Enumerable.Select (лениво создавая последовательность) и Array.ConvertAll (нетерпеливо проецируя массив).

Ни один из этих способов не является итерацией по массиву или последовательности, хотя - они проекции .Как говорит Стрингер Белл, Array.iter и Seq.iter являются подходящими функциями для итерации.

5 голосов
/ 24 сентября 2010

Вы должны использовать Seq.iter, если хотите перебрать свою коллекцию, просто так:

[|"a"; "b"|] |> Seq.iter (fun f -> printfn "%A" f);;

Также вы можете просто использовать Array.iter, если только перебирать массивы:

[|"a"; "b"|] |> Array.iter (fun f -> printfn "%A" f);;

Другая (и более короткая) альтернатива - прямая передача значения в функцию printfn "%A":

[|"a"; "b"|] |> printfn "%A";;

выведет [|"a"; "b"|].Обратите внимание, что в этом случае F # печатает его в точности так, как вы бы его кодировали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...