Care to explain in more depth? If the function is type stable i.e. it
returns an Int for an Int input then why would ntuple(::Function,::Int) not
be type stable? What do you mean by the return type depends on the "value"
of the integer (it's an integer!). Am I misunderstanding?
On Monday, August 1, 2016 at 11:40:25 AM UTC-4, Kristoffer Carlsson wrote:
>
> Nope. nuple(::Function, ::Int) is not type stable because the return type
> depends on the value of the integer.
>
> On Monday, August 1, 2016 at 5:17:10 PM UTC+2, mmh wrote:
>>
>> Is this a known bug/regression?
>>
>> On Sunday, July 31, 2016 at 10:53:11 PM UTC-4, Sheehan Olver wrote:
>>>
>>> It still doesn't infer the type in 0.5:
>>>
>>> *julia> **@code_warntype ntuple( x -> 0, 3)*
>>>
>>> Variables:
>>>
>>> #self#::Base.#ntuple
>>>
>>> f::##5#6
>>>
>>> n::Int64
>>>
>>>
>>> Body:
>>>
>>> begin
>>>
>>> unless (Base.sle_int)(n::Int64,0)::Bool goto 3
>>>
>>> return (Core.tuple)()::Tuple{}
>>>
>>> 3:
>>>
>>> unless (n::Int64 === 1)::Bool goto 6
>>>
>>> return (Core.tuple)($(QuoteNode(0)))::Tuple{Int64}
>>>
>>> 6:
>>>
>>> unless (n::Int64 === 2)::Bool goto 9
>>>
>>> return
>>> (Core.tuple)($(QuoteNode(0)),$(QuoteNode(0)))::Tuple{Int64,Int64}
>>>
>>> 9:
>>>
>>> unless (n::Int64 === 3)::Bool goto 12
>>>
>>> return
>>> (Core.tuple)($(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)))::Tuple{Int64,Int64,Int64}
>>>
>>> 12:
>>>
>>> unless (n::Int64 === 4)::Bool goto 15
>>>
>>> return
>>> (Core.tuple)($(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)))::Tuple{Int64,Int64,Int64,Int64}
>>>
>>> 15:
>>>
>>> unless (n::Int64 === 5)::Bool goto 18
>>>
>>> return
>>> (Core.tuple)($(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)))::Tuple{Int64,Int64,Int64,Int64,Int64}
>>>
>>> 18:
>>>
>>> unless (Base.slt_int)(n::Int64,16)::Bool goto 21
>>>
>>> return (Core._apply)(Core.tuple,$(Expr(:invoke, LambdaInfo for
>>> ntuple(::##5#6, ::Int64), :(Base.ntuple), :(f),
>>> :((Base.box)(Int64,(Base.sub_int)(n,5))))),(Core.tuple)($(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)),$(QuoteNode(0)))::Tuple{Int64,Int64,Int64,Int64,Int64})
>>> *::Tuple{Vararg{Any,N}}*
>>>
>>> 21:
>>>
>>> return $(Expr(:invoke, LambdaInfo for _ntuple(::Function,
>>> ::Int64), :(Base._ntuple), :(f), :(n)))
>>>
>>> end*::Tuple*
>>>
>>> On Monday, August 1, 2016 at 10:34:30 AM UTC+10, David P. Sanders wrote:
>>>>
>>>>
>>>>
>>>> El domingo, 31 de julio de 2016, 20:16:04 (UTC-4), Sheehan Olver
>>>> escribió:
>>>>>
>>>>> I'm doing the following:
>>>>>
>>>>>
>>>>> immutable FooIterator{d} end
>>>>>
>>>>> Base.start(::FooIterator{d}) = tuple(zeros(Int,d)...)::NTuple{d,Int}
>>>>>
>>>>
>>>>
>>>> You can use the `ntuple` function, which constructs a tuple from a
>>>> function:
>>>>
>>>> julia> ntuple( x -> 0, 3)
>>>> (0,0,0)
>>>>
>>>> julia> typeof(ans)
>>>> Tuple{Int64,Int64,Int64}
>>>>
>>>>
>>>>>
>>>>>
>>>>> But is there a more elegant way of getting the type inferred? I
>>>>> suppose I can override low order d directly:
>>>>>
>>>>> Base.start(::FooIterator{2}) = (0,0)
>>>>> Base.start(::FooIterator{3}) = (0,0,0)
>>>>>
>>>>