Seq.iter vs for - какая разница? - PullRequest
10 голосов
/ 20 апреля 2011

Я могу сделать

for event in linq.Deltas do

или я могу сделать

linq.Deltas |> Seq.iter(fun event ->

Так что я не уверен, что это то же самое. Если это не то же самое, я хочу знать разницу. Я не знаю, что использовать: iter или for.

добавлено - поэтому, если это вопрос выбора, я предпочитаю использовать iter на верхнем уровне и for для замыканий

добавлено несколько позже - похоже, iter - это map + ignore - это способ избежать использования слова императивного игнорирования. Так что это выглядит как функциональный способ ...

Ответы [ 5 ]

17 голосов
/ 20 апреля 2011

Как уже упоминалось, есть некоторые различия (iter поддерживает неуниверсальные IEnumerator, и вы можете изменять значения mutable в for).Иногда это важные различия, но в большинстве случаев вы можете свободно выбирать, какой из них использовать.

Я обычно предпочитаю for (если есть языковая конструкция, почему бы не использовать ее?).* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

'' * '*' * '* * * * * * * * * * * * * * * * * * * * * *1011* * * * * * * "*1001*» * "какого-то конвейера обработки:

// I would write this:
inputs |> Seq.filter (fun x -> x > 0)
       |> Seq.iter (fun x -> foo x)

// instead of:
let filtered = inputs |> Seq.filter (fun x -> x > 0)
for x in filtered do foo x
10 голосов
/ 20 апреля 2011

Вы можете изменять изменяемые переменные из тела цикла for. Вы не можете сделать это из замыкания, что означает, что вы не можете сделать это, используя iter. (Примечание: я имею в виду изменяемые переменные, объявленные вне for / iter. Доступны локальные изменяемые переменные.)

Учитывая, что смысл iter заключается в выполнении какого-либо побочного эффекта, разница может быть важной.

Лично я редко использую iter, так как нахожу for более понятным.

2 голосов
/ 20 апреля 2011

Для большинства ситуаций они одинаковы.Я бы предпочел первое использование.Это выглядит ясно для меня.

Разница в том, что for in цикл поддерживает IEnumerable объекты, тогда как Seq.iter требует, чтобы ваша коллекция (linq.deltas) была IEnumerable<T>.

Например, MatchCollection классРегулярное выражение .net наследует IEnumerable, а не IEnumerable<T>, вы не можете напрямую использовать Seq.map или Seq.iter.Но вы можете использовать цикл for in.

1 голос
/ 20 апреля 2011

Это стиль программирования.Императив против использования функционального программирования.Имейте в виду, что F # не является чисто функциональным языком программирования.

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

0 голосов
/ 20 апреля 2011

for в F # является формой понимания списка - хлеб функциональности программирования, в то время как Seq.iter - императивная конструкция «только для побочных эффектов» - не признак функционального кода,Вот что вы можете сделать с for:

let pairsTo n = seq {
    for i in [1..n] do
        for j in [i..n] do
             if j%i <> 0 then yield (i,j) }

printf "%A" (pairsTo 10 |> Seq.toList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...