使用f#中的Sequences强制计算的最惯用的样式是什么?

时间:2012-03-09 09:27:27

标签: arrays f# sequences deferred

我有一个有效的操作

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

让代码执行的最惯用的方法是什么?

我写了一个Seq.Doit,但它发痒

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

2 个答案:

答案 0 :(得分:6)

我认为Seq.iter在这种情况下是合适的。从MSDN参考页面:

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

将给定函数应用于集合的每个元素。

因此,假设request.Append没有返回任何内容,则代码变为:

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

答案 1 :(得分:2)

使用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