Thanks for the pointer to https://github.com/JuliaLang/julia/issues/3738
<https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2FJuliaLang%2Fjulia%2Fissues%2F3738&sa=D&sntz=1&usg=AFQjCNGbr2GU-CZD2ql7KGVDb5Nh0eZCBQ>
.
I filed a documentation
issue https://github.com/JuliaLang/julia/issues/13702
And thanks for promote_scalar_or_eltype. I first thought it's the same as
Base.promote_eltype (for the example you provided it is), but for string
parameters it's different:
promote_scalar_or_eltype("foo", ["foo", "bar"]) # returns ASCIIString
Base.promote_eltype("foo", ["foo", "bar"]) # returns Any
My ultimate goal is to make vcat itself type stable in case the parameters
are all either T or AbstractVector{T} for arbitrary T, so the
signature vcat(args::Union{Number, AbstractVector}...) would not be general
enough. vcat(args::Union{Any, AbstractVector}...) seems to be equivalent to
vcat(args...).
I guess the only possibility is to check the types in the code of the
generated function.
On Tuesday, October 20, 2015 at 5:20:16 PM UTC+2, Matt Bauman wrote:
>
> See https://github.com/JuliaLang/julia/issues/3738. In particular:
> "`Union` with static parameters is generally problematic… A few easy cases
> are handled by the greedy approximation I use, but it's easiest just to
> keep static parameters out of unions for now."
>
> On Tuesday, October 20, 2015 at 10:45:15 AM UTC-4, Glen O wrote:
>>
>> On Wednesday, 21 October 2015 00:15:41 UTC+10, Matt Bauman wrote:
>>>
>>> On Tuesday, October 20, 2015 at 10:09:42 AM UTC-4, Glen O wrote:
>>>>
>>>> Seems to be something wrong with the dispatch system with Union...
>>>>
>>>
>>> Yes, Unions with TypeVars can behave strangely when the elements aren't
>>> mutually exclusive. I think it's just greedily matching the first thing it
>>> can. In this case it's always matching the `T` in `Union{T,
>>> AbstractArray{T}}` to the type of the very first argument, and then
>>> applying that to the remaining arguments, which explains why it works with
>>> a scalar first argument.
>>>
>>
>> That doesn't explain how my test works - if
>> dispatchtest{T}(x::Union{Array{T,1},T}) = "success"
>> is called with dispatchtest([1,2]), it fails, even though T=Array{Int,1}
>> should match.
>>
>