Какой самый идиоматический стиль для форсировки вычислений с использованием последовательностей в f #? - PullRequest
1 голос
/ 09 марта 2012

У меня есть побочная операция

     securities |> Seq.map (fun x -> request.Append("securities",x))

Какой самый идиоматичный способ заставить код работать?

Я написал Seq.Doit, но он чешется

  module Seq =
     let Doit sa = sa |> Seq.toArray |> ignore

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Я думаю, Seq.iter подходит в этом случае.Со справочной страницы MSDN:

Seq.iter : ('T -> unit) -> seq<'T> -> unit

Применяет данную функцию к каждому элементу коллекции.

Итак, предположим, что request.Append ничего не возвращает, ваш код становится:

securities |> Seq.iter (fun x -> request.Append("securities", x))
2 голосов
/ 09 марта 2012

Отложенные последовательности используются при создании последовательностей с использованием Seq.delay или выражения последовательности seq {}.Любая функция в последовательности, возвращающая любой тип данных, кроме seq, может форсировать вычисления.

В качестве альтернативы вы можете использовать цикл for вместо Seq.iter:

for s in securities do
   request.Append("securities", s)

Если вы хотитескрыть побочные эффекты и вернуть request для дальнейшего использования, Seq.fold - хороший выбор:

securities |> Seq.fold (fun acc x -> acc.Append("securities", x); acc) request
...