Ahh. I see. Thanks.

With the sum function, and by extension any function that deals with 
iterables, is it safe to assume they work without allocating storage for 
the results of the iterable? Maybe a better question would be, are 
functions like filter and sum behaving in a lazy fashion?

On Saturday, December 6, 2014 12:37:44 PM UTC-5, Stefan Karpinski wrote:
>
> 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] <javascript:>
> > 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