
Another way to define 'rule' here, just for kicks:
rule = 2 : 4 : rule
On Mon, Jul 21, 2008 at 11:57 AM, Dirk Markert
Hi Kurt,
thank you for the detailed explanation. Indeed, I could follow your explanation on first reading :-)
Dirk
2008/7/21 Kurt Hutchinson
: On Mon, Jul 21, 2008 at 9:34 AM, Dirk Markert
wrote: I am trying to generate the following list: 2, 3, 5 -- and then alternating (+2) resp (+4) -- 7, 11, 13, 17, 19, 23
I came up with the following solution 2:3:unfoldr (\(a,b) -> Just (a,(a+b, if b == 2 then 4 else 2))) (5,2)
Are there easier ways to generate the desired list?
So you've got the beginnings of an infinite list, and a rule to modify that to generate new elements. How about turning that rule into a list of its own, and then combining them?
rule = cycle [ 2, 4 ] -- this will give an infinite list of 2's and 4's
Combining two lists is usually done with 'zip'. But in this case, we don't just want tuples, we want the sum of each pair. You can combine lists with a function by using 'zipWith'. Start at the point where the rule kicks in.
rest = 5 : zipWith (+) rest rule
Now just tack on your first elements.
list = 2 : 3 : rest
Here it is all in one place:
list = 2 : 3 : rest where rule = cycle [ 2, 4 ] rest = 5 : zipWith (+) rest rule
Kurt
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners