The function that fails is var, not sum. However, I really don't think that
var is the problem. As you point out, the problem is type inference on
comprehensions in global scope.

2014-11-19 10:32 GMT-05:00 Erik Schnetter <[email protected]>:

> That is not a very satisfying answer... If Julia's REPL emits errors
> for perfectly valid code, something is wrong.
>
> I tried this with Julia 0.4 (development version), and there is no
> error. (Good!) However, the type of s is still Array{Any,1} instead of
> Array{Int,1}. I appreciate that correcting this may be difficult, but
> all the information is right there -- the type of t is known.
>
> If expressions need to be wrapped in functions to make things work,
> then maybe the REPL could do that automatically?
>
> Anyway, my main point being: The fact that sum reports an error here
> is clearly an error, and seems corrected in the development version.
>
> -erik
>
> On Wed, Nov 19, 2014 at 3:37 AM, Mauro <[email protected]> wrote:
> > This is because Julia's type inference is not good in global scope and
> > thus the list comprehension returns a Array{Any,1}.  Wrap it in a
> > function instead:
> >
> > julia> t = [1:2]
> > 2-element Array{Int64,1}:
> >  1
> >  2
> >
> > julia> s = [sum(t[1:i]) for i=1:length(t)]
> > 2-element Array{Any,1}:
> >  1
> >  3
> >
> > julia> zero(eltype(e)) # this is what happens inside var
> > ERROR: `convert` has no method matching convert(::Type{MathConst{:e}},
> ::Int64)
> >  in zero at number.jl:47
> >
> > julia> f(t) =  [sum(t[1:i]) for i=1:length(t)]
> > f (generic function with 1 method)
> >
> > julia> f(t)
> > 2-element Array{Int64,1}:
> >  1
> >  3
> >
> > julia> s =f(t)
> > 2-element Array{Int64,1}:
> >  1
> >  3
> >
> > julia> zero(eltype(s))
> > 0
> >
> > Generally it is good to put all your stuff into functions so Julia can
> > do its type inference.  Better performance and sometime, as in your
> > case, no errors.
> >
> > On Tue, 2014-11-18 at 23:27, witek gawlowski <[email protected]>
> wrote:
> >> Hello,
> >> some basic question although i couldn't find an answer easily:
> >>
> >> if i run
> >> using StatsBase
> >> t = [1:10]
> >> s = [sum(t[1:i]) for i=1:10]
> >> var(s)
> >>
> >> i get an error: `zero` has no method matching zero(::Type{Any})
> >>
> >> I see t is of [a, b, c] type and s is of {a, b, c} type. Can you give me
> >> the topics to search for?
> >> also if s is representing a list why do i have to convert it to
> something
> >> else (i guess) to calculate its variance?
> >>
> >> Regards
> >
>
>
>
> --
> Erik Schnetter <[email protected]>
> http://www.perimeterinstitute.ca/personal/eschnetter/
>

Reply via email to