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

| 我可以
for event in linq.Deltas do
或者我可以做
linq.Deltas |> Seq.iter(fun event ->
所以我不确定是否相同。如果那不一样,我想知道区别。我不知道该用什么:
iter
for
。 添加了-因此,如果这是选择的问题,我更喜欢在顶层使用
iter
,而
for
用于闭包 稍后再添加一些内容-看起来
iter
map
+
ignore
-这是使用命令式忽略字的一种方式。所以看起来就像是功能方式...
已邀请:
您可以从“ 3”循环的主体修改可变变量。您不能从闭包中做到这一点,这意味着您无法使用
iter
做到这一点。 (注意:我说的是在
for
/
iter
之外声明的可变变量。可以访问局部可变变量。) 考虑到
iter
的一点是要产生一些副作用,所以这种差异可能很重要。 我个人很少使用
iter
,因为我发现
for
更清楚。
正如其他人提到的那样,存在一些差异(
iter
支持非泛型
IEnumerator
,并且您可以在
for
中突变
mutable
值)。这些有时是重要的差异,但是大多数时候您可以自由选择要使用的哪个。 我通常更喜欢
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
对于大多数情况,它们是相同的。我希望第一次使用。在我看来很清楚。 不同之处在于
for in
循环支持
IEnumerable
对象,而Seq.iter要求您的集合(
linq.deltas
)为
IEnumerable<T>
。 例如。 .net正则表达式中的
MatchCollection
类继承
IEnumerable
而不是
IEnumerable<T>
,因此不能直接在其上使用
Seq.map
Seq.iter
。但是您可以使用
for in
循环。
这是编程风格。命令式与使用函数式编程。请记住,F#不是纯函数式编程语言。 通常,如果Seq.Iter是大型流水线处理的一部分,请使用Seq.Iter,因为这会使它更加清晰,但是对于普通情况,我认为命令式方法更加清晰。有时这是个人喜好,有时是诸如性能之类的其他问题。
F#中的
for
是列表理解的一种形式-函数式编程的基础,而
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)

要回复问题请先登录注册