2011-04-20 93 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 
相關問題