Hi, first post to clr here.

I have a guess a haskell bias as that's the last language I learned,
and now I'm learning ruby.

I was trying to solve project euler problem 2 as an exercise. This is,
sum all the even fibonacci numbers less than 4 million.

There is a solution that works at

http://www.absorbeo.net/2008/01/10/project-euler-problem-2/

however I didn't quite like it because the test for evenness is in the
fold (haskell speak for inject).

puts a.inject(0) {|s,v|
  if v > 1_000_000 then
    break s
  elsif v % 2 == 0
      s+v
  else
    s
  end
}

the haskell solution reads nicer to me

t = ( putStrLn . show . sum . takeWhile (<=4000000) . filter even )
fibs2
fibs2 = 1 : 2 : zipWith (+) fibs2 (tail fibs2)

but it relies on laziness and who knows what other magic.

I decided to see if I could find a ruby solution that was more
haskellish. It turns I can... almost.

There is a ruby library for laziness

# http://lazylist.rubyforge.org/

and it would seem to do what I want. But it hangs for some reason.

I have poor sense of ruby culture. Should I report this as a bug? Is
it even a bug? Do people ever use laziness, or is this crazy
experimentation?

Thanks for help and advice!

Code below:

thartman@thartman-laptop:~/thomashartman-learning/ruby/katas/euler>cat
2.rb
require 'rubygems'
require 'lazylist' # http://lazylist.rubyforge.org/

# Solve Project Euler problem 2: sum fibonacci numbers <= 4_000_000,
which are even.
fibs = ( LazyList.tabulate(0) { |x| x < 2 ? 1 : fibs[x-2] +
fibs[x-1] } )

fibsUnder4M = ( fibs.partition{ |x| x <= 4_000_000 })[0]
evenFibsUnder4M = fibsUnder4M.select{ |x| x %2 == 0}

# problem seems to be with partition
# evenFibsLessThanFourMil = ( evenFibs.partition{ |x| x <= 4_000_000 })
[0]

# works
# puts evenFibsLessThanFourMil.take(1)

# hangs
puts evenFibsUnder4M.take(10) # this is ok
puts evenFibsUnder4M.take(11) # this hangs, laptop gets hot, fan turns
on...
# exit

# this would be the answer to the euler problem, if only there wasn't
the bug...
result = evenFibsLessThanFourMil.inject(0){ | accum,val | accum + val}

main = puts result
thartman@thartman-laptop:~/thomashartman-learning/ruby/katas/
euler>ruby 2.rb
2
8
34
144
610
2584
10946
46368
196418
832040
   ..... hung...