[Haskell-begin] Alternating sequence

Andrew Wagner wagner.andrew at gmail.com
Mon Jul 21 12:01:47 EDT 2008


Another way to define 'rule' here, just for kicks:
rule = 2 : 4 : rule


On Mon, Jul 21, 2008 at 11:57 AM, Dirk Markert <dirk.markert at gmail.com> wrote:
> Hi Kurt,
>
> thank you for the detailed explanation. Indeed, I could follow your
> explanation on first reading :-)
>
> Dirk
>
> 2008/7/21 Kurt Hutchinson <kelanslists at gmail.com>:
>>
>> On Mon, Jul 21, 2008 at 9:34 AM, Dirk Markert <dirk.markert at gmail.com>
>> 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>


More information about the Beginners mailing list