Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Seq.iter vs for - what difference?

Tags:

f#

I can do

for event in linq.Deltas do

or I can do

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

So I'm not sure if that is the same. If that is not the same I want to know the difference. I don't know what to use: iter or for.

added - so if that is the matter of choice I prefer to use iter on a top level and for is for closures

added some later - looking like iter is map + ignore - it's the way to run from using imperative ignore word. So it's looking like functional way ...

like image 257
cnd Avatar asked Apr 20 '11 06:04

cnd


People also ask

What is the underlying difference between a sequence and a list in F #?

The list is created on declaration, but elements in the sequence are created as they are needed. As a result, sequences are able to represent a data structure with an arbitrary number of elements: > seq { 1I ..

What is SEQ in F#?

Seq. groupBy takes a sequence and a function that generates a key from an element. The function is executed on each element of the sequence. Seq. groupBy returns a sequence of tuples, where the first element of each tuple is the key and the second is a sequence of elements that produce that key.

What is yield in F#?

F# Sequence Workflows yield and yield! (pronounced yield bang) inserts all the items of another sequence into this sequence being built. Or, in other words, it appends a sequence. (In relation to monads, it is bind .)


1 Answers

As others mentioned, there are some differences (iter supports non-generic IEnumerator and you can mutate mutable values in for). These are sometimes important differences, but most of the times you can freely choose which one to use.

I generally prefer for (if there is a language construct, why not use it?). The cases where iter looks nicer are when you have a function that you need to call (e.g. using partial application):

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

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

Similarly, using iter is nicer if you use it at the end of some processing pipeline:

// 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
like image 118
Tomas Petricek Avatar answered Oct 12 '22 02:10

Tomas Petricek