The issue is that comprehensions pre-allocate their storage and therefore
only work when the thing being iterated over has a length method that can
tell it how big an array to allocate. You can use the collect function
instead:

julia> collect(@task fib(4000000))
34-element Array{Any,1}:
       0
       1
       1
       2
       3
       5
       8
      13
      21
      34
      55
      89
     144
     233
     377
     610
     987
    1597
    2584
    4181
    6765
   10946
   17711
   28657
   46368
   75025
  121393
  196418
  317811
  514229
  832040
 1346269
 2178309
 3524578

julia> filter(iseven, ans)
12-element Array{Any,1}:
       0
       2
       8
      34
     144
     610
    2584
   10946
   46368
  196418
  832040
 3524578

julia> sum(ans)
4613732


But you can also just use the sum function, which will operate on anything
iterable:

julia> sum(filter(iseven, @task fib(4000000)))
4613732


A while ago I added a bunch of fairly efficient solutions to Project Euler
problems to the test suite, including #2, but don't click if you don't want
spoilers:

https://github.com/JuliaLang/julia/blob/7dd805feb0/test/euler.jl#L9-L20



On Sat, Dec 6, 2014 at 12:04 PM, Bill Allen <[email protected]> wrote:

> To learn julia, I'm working my way through Project Euler
> <https://projecteuler.net/>. For question #2,
> <https://projecteuler.net/problem=2> I ran into an issue that I haven't
> found a solution to.
>
> Given a function that computes fibonacci numbers:
>
> function fib(n)
>        a,b = 0,1
>        while(a < n)
>            produce(a)
>            a,b=b,a+b
>        end
> end
>
> I can write a loop that computes the value:
>
> function fibsum(n)
>            s = 0
>            for x in Task(() -> fib(n))
>                if x % 2 == 0
>                    s = s + x
>                end
>            end
>            s
> end
>
> fibsum(4000000)
> 4613732
>
> Analogously, one can write:
>
> s = 0
> for x in [1,2,3]
>     s = s + x
> end
> println(s)
> 6
>
> or more succinctly,
>
> sum([x for x in [1,2,3]])
>
> But, when I try that with the fib Task:
>
> sum([x for x in Task(()->fib(10))])
>
> I get
>
> ERROR: `length` has no method matching length(::Task)
>  in anonymous at no file
>
> Which confuses me sense the task works nicely in an explicit loop.
>
> Regards,
> Bill
>
>

Reply via email to