Seq.iter vs for - 有什么区别?

时间:2011-04-20 06:53:40

标签: f#

我能做到

for event in linq.Deltas do

或者我可以做到

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

所以我不确定这是否相同。如果那不一样,我想知道区别。我无法选择使用内容:iterfor

已添加 - 因此,如果这是选择问题,我更倾向于在顶层使用iter,而for则用于clousures

稍后添加 - 看起来itermap + ignore - 这是使用命令式忽略词运行的方式。所以它看起来像功能性的方式......

5 个答案:

答案 0 :(得分:17)

正如其他人所提到的,存在一些差异(iter支持非通用IEnumerator,您可以在mutable中改变for个值。这些有时是重要的差异,但大多数时候你可以自由选择使用哪一种。

我通常更喜欢for(如果有语言结构,为什么不使用它?)。 iter看起来更好的情况是当你有一个需要调用的函数时(例如使用部分应用程序):

// I would write this:
strings |> Seq.iter (printfn "%c")

// instead of:
for s in strings do printfn "%c" s

同样,如果在某些处理管道的末尾使用iter,则使用// 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 会更好:

{{1}}

答案 1 :(得分:10)

您可以从for循环的主体修改可变变量。你不能通过闭包来做到这一点,这意味着你不能使用iter来做到这一点。 (注意:我所说的是在for / iter之外声明的可变变量。可以访问本地可变变量。)

考虑到iter的要点是要产生一些副作用,差异可能很重要。

我个人很少使用iter,因为我发现for更清晰。

答案 2 :(得分:2)

对于大多数情况,它们是相同的。我更喜欢第一次使用。它看起来很清楚。

区别在于for in循环支持IEnumerable个对象,而Seq.iter要求您的集合(linq.deltas)为IEnumerable<T>

E.g。 .net正则表达式中的MatchCollection类继承IEnumerable而不是IEnumerable<T>,您不能直接使用Seq.mapSeq.iter。但是你可以使用for in循环。

答案 3 :(得分:1)

这是编程的风格。势在必行与使用函数式编程。请记住,F#不是纯函数式编程语言。

通常,如果它是某些大型流水线处理的一部分,则使用Seq.Iter,因为这使得它更加清晰,但对于普通情况,我认为必要的方式更清晰。有时这是个人偏好,有时候还有性能等其他问题。

答案 4 :(得分:0)

F#中的{p> forlist comprehension的一种形式 - 功能性编程的面包和黄油,而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)