This example should clarify where you're confused:


julia> typeof(ntuple(x -> 1, 1))

Tuple{Int64}


julia> typeof(ntuple(x -> 1, 2))

Tuple{Int64,Int64}

On Tuesday, August 2, 2016 at 2:34:27 PM UTC-5, mmh wrote:
>
> 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)
>>>>>>
>>>>>

Reply via email to