Simpler Fibonacci function

Frank Seaton Taylor fstaylo@alpha.ncsc.mil
Tue, 5 Feb 2002 14:45:38 -0500


On Tuesday, February 5, 2002, at 02:16 , Jeffrey R Lewis wrote:

> On Tuesday 05 February 2002 09:40 am, Brian Berns wrote:
>> I am new to functional programming and teaching myself Haskell.  The
>> canonical Haskell "fib" function (e.g. as presented in the "Gentle"
>> tutorial) is:
>>
>>    fib = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]
>>
>> This seems, to be polite, a bit overly complex.  By comparison, here
>> is a simpler version:
>
> As an aside, here's a nicer way of writing the stream version of fib:
>
>     fib = 1 : 1 : [ a + b | a <- fib | b <- tail fib ]
>
> This gets rid of the distraction of the zip and the pair, letting you 
> see
> the simple structure of the definition more clearly.
>
> This, however, is not Haskell 98 (the use of multiple generators 
> separated
> by `|').  But it is supported by both GHC and Hugs (using flag -98).  
> See
> the sections in the user manuals under `parallel list comprehensions'.
>
> --Jeff
> http://www.haskell.org/mailman/listinfo/haskell

And while you're at it start the sequence with 0 : 1 : ... so that it 
has the nice property that:

   gcd (fib !! m) (fib !! n) == fib !! (gcd m n)

--
Frank Seaton Taylor
fstaylo@alpha.ncsc.mil