On Sunday, October 16, 2016 at 12:12:14 AM UTC+2, Yichao Yu wrote:
>
>
>
> 2016-10-15 18:06 GMT-04:00 jw3126 <jw3...@gmail.com <javascript:>>:
>
>> myop(::Int16, ::Int16) = Int32(1)
>> myop(::Int16, ::Int32) = Int64(1)
>> myop(::Int16, ::Int64) = Int128(1)
>> myop(::Int16, ::Int128) = Int128(1)
>>
>> foldr(myop, Int16[1]) |> typeof |> println
>> foldr(myop, Int16[1,1]) |> typeof |> println
>> foldr(myop, Int16[1,1,1]) |> typeof |> println
>> foldr(myop, Int16[1,1,1,1]) |> typeof |> println
>>  
>>
>> gives
>>
>>
>> Int32
>> Int64
>> Int128
>> Int128
>>
>> Would it be better if the answer was typestable (always Int128)? See 
>> also here <https://github.com/JuliaLang/julia/issues/18960>.
>>
>
> Yes it would be better if you implement your operation that way and no the 
> compiler cannot do this.
>

One could change the promotion in foldr to use something like the following:

accumulate_eltype(op, T) = accumulate_eltype(op, T, T)

function accumulate_eltype(op, T, S)
    S_next = promote_op(op, T, S)
    if S == S_next
        return S
    else
        return accumulate_eltype(op, T, S_next) 
    end
end 

>  
>
>

Reply via email to