I really think the only code that should be too worried about whether something is a leaf type or not is the compiler...
On Wed, Apr 30, 2014 at 10:59 AM, Tim Holy <[email protected]> wrote: > What's wrong with parameters? Are you making life harder for yourself than > you > need to? :-) > > If you're worried about the (very slight) overhead (isleaftype calls out > to C, > and therefore can't be inlined), then you could use a Union where you > specify > all the types you allow. Or define the following function: > > fastleaftype{T}(::Type{T}) = error("Must be a concrete type") > > for x in names(Core) > T = eval(x) > if isleaftype(T) && T <: Number > @eval begin > fastleaftype(::Type{$T}) = nothing > end > end > end > > Then: > > function myfunction(x::Array) > fastleaftype(eltype(x)) > x .+ 1 > end > > Now check this out: > julia> code_typed(myfunction, (Matrix{Float64},)) > 1-element Array{Any,1}: > :($(Expr(:lambda, {:x}, {{},{{:x,Array{Float64,2},0}},{}}, :(begin # > none, > line 2: > nothing # line 3: > return x::Array{Float64,2} .+ 1::Array{Float64,2} > end::Array{Float64,2})))) > > julia> code_typed(myfunction, (Matrix{Real},)) > 1-element Array{Any,1}: > :($(Expr(:lambda, {:x}, {{},{{:x,Array{Real,2},0}},{}}, :(begin # none, > line > 2: > throw($(Expr(:new, :(top(getfield) > (Base,:ErrorException)::Type{ErrorException}), "Must be a concrete > type"))::ErrorException)::None # line 3: > return x::Array{Real,2} .+ 1::Array{Real,2} > end::Array{Real,2})))) > > > The compiler does the check for you, and this adds nothing whatsoever to > your > runtime. > > --Tim > > > On Wednesday, April 30, 2014 07:37:05 AM Oliver Woodford wrote: > > On Wednesday, April 30, 2014 3:20:23 PM UTC+1, Tim Holy wrote: > > > You can add this as the first line of your function: > > > assert_leaftype(T) > > > > > > where > > > > > > assert_leaftype(T) = isleaftype(T) || error("Must be a concrete > type") > > > > > > To your users, this is at least as useful as > > > > > > ERROR: no method myfunction(Array{Real,1}) > > > > > > which is what it would be if you relied on method dispatch to generate > the > > > error (which is what I think you're asking for). > > > > > > --Tim > > > > It's OK, but it still requires me to have a static parameter. Is there a > > O(1) time solution which avoids the need for static parameters. Something > > like: > > > > function frob(x::Array) > > isleaftype(x) || error("Homogeneous array required") > > > > though I know this won't work. >
