我能做到
for event in linq.Deltas do
或者我可以做到
linq.Deltas |> Seq.iter(fun event ->
所以我不确定这是否相同。如果那不一样,我想知道区别。我无法选择使用内容:iter
或for
。
已添加 - 因此,如果这是选择问题,我更倾向于在顶层使用iter
,而for
则用于clousures
稍后添加 - 看起来iter
是map
+ ignore
- 这是使用命令式忽略词运行的方式。所以它看起来像功能性的方式......
答案 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.map
或Seq.iter
。但是你可以使用for in
循环。
答案 3 :(得分:1)
这是编程的风格。势在必行与使用函数式编程。请记住,F#不是纯函数式编程语言。
通常,如果它是某些大型流水线处理的一部分,则使用Seq.Iter,因为这使得它更加清晰,但对于普通情况,我认为必要的方式更清晰。有时这是个人偏好,有时候还有性能等其他问题。
答案 4 :(得分:0)
for
是list 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)