On Sunday, October 16, 2016 at 12:12:14 AM UTC+2, Yichao Yu wrote:
>
>
>
> 2016-10-15 18:06 GMT-04:00 jw3126 <[email protected] <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
>
>
>