[Haskell-beginners] another list comprehesion error
Thomas
haskell at phirho.com
Thu Jul 21 23:40:52 CEST 2011
Hi!
On 21.07.2011 21:29, Roelof Wobben wrote:
> roelof n x = [x | y<- [1..n]]
Have you tried this?
What do you get for, say "roelof 4 5" ? Why?
Now try this instead:
roelof' n = [x | x <- [1..n]]
What do you get for "roelof' 4" ?
> So I thought the syntax of a list compression would be [output | filter<- input]
> But the answer is now [ output | input<- filter] This is very confusing for me.
Hm, in the terminology of the book you're using the list comprehension
[x | x <- [1..n]] reads
"all x such that x drawn from [1..n]"
So, you have a result (x) and a generator (x <- [1..n]).
What you call "filter" is called "guard" in the book.
So actually you have:
[ result | generator(s) ]
or (with guards):
[ result | generator(s), guards(s) ]
So, note that the comma (,) is a mere separator and the left arrow (<-)
forms part of the generators (everything else is a guard or an error).
Especially the term "input" is rather misleading.
Generators are explained in chapter 5.1 (page 38f), guards are explained
in 5.2 (page 39f). I'm not sure I can explain better than the book.
Maybe you should experiment with generators first and then advance to
the guards.
A few suggestions (without guards):
The list of the first 5 natural numbers.
The list of the first 5 odd numbers.
The list of all pairs (a, b) where a,b > 0, a <= b and b <= 5
Now you can try the last two with guards.
HTH,
Thomas
More information about the Beginners
mailing list