2011-04-20 97 views
10

我可以做Seq.iter vs - 有什么区别?

for event in linq.Deltas do 

或者我可以做

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

所以我不知道这是一样的。如果不一样,我想知道其中的差别。我不能选择使用什么:iterfor

添加 - 所以如果这是一个选择的事情我宁愿在顶层使用iterfor是clousures

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

回答

10

可以从for循环体中修改可变的变量。你不能这样做,这意味着你不能这样做,使用iter。 (注意:我说的是for/iter之外声明可变变量局部可变的变量都可以访问)

考虑的iter关键是要执行一些副作用,差异也很重要。

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

3

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

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

例如MatchCollection类.NET正则表达式继承IEnumerableIEnumerable<T>,你不能用它Seq.mapSeq.iter直接。但你可以使用for in循环。

+0

你仍然可以做一些像序列{在matchCollection X - > X} – manojlds 2011-04-20 07:12:22

+1

或者'matchColl |> seq.cast |> Seq.iter' – ildjarn 2011-04-20 15:37:45

+1

@ildjarn - 见http://fssnip.net/ 4f为另一种可能性。 – kvb 2011-04-20 16:27:42

2

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

一般情况下,使用Seq.Iter如果是一些大型的流水线处理的一部分,因为这使得它更清晰,但通常情况下,我认为当务之急的方法是清晰的。有时候这是个人偏好,有时候还有其他问题,比如表现。

1

for in F#是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) 
+3

在F#中有两个不同的'for' - 一个在列表解析中(正如你所说),另一个是'for'的命令,与'Seq.iter'非常相似。 – 2011-04-20 10:36:19

17

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

我通常更喜欢for(如果有语言结构,为什么不使用它?)。如果你在一些处理流水线的末端使用它

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

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

同样,使用iter是更好:其中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 
相关问题