Very nice summary!

I assume that there's a mile-long issue discussing this somewhere, but why 
doesn't the return type also assert that convert returns a value of the 
correct type?

type A end
Base.convert(::Type{Int}, ::A) = "hey"
foo()::Int = A()
foo()  # returns "hey"


On Wednesday, October 12, 2016 at 4:29:09 PM UTC-4, Jared Crean wrote:
>
>   Perfect, thanks.
>
>   Jared Crean
>
> On Wednesday, October 12, 2016 at 2:40:03 PM UTC-4, harven wrote:
>>
>>
>>
>> Le mercredi 12 octobre 2016 01:45:25 UTC+2, Jared Crean a écrit :
>>>
>>> Very nice summary, thanks for posting.  One question I had was what 
>>> should the signature of a function be to receive a generator?  For example, 
>>> if the only method of extrema is extrema(A::AbstractArray), is that too 
>>> restrictive?
>>>
>>>   Jared Crean
>>>
>>>
>> Any functions working with iterables will work with generators. 
>>
>> julia> methods(extrema)
>> # 4 methods for generic function "extrema":
>> extrema(r::Range) at reduce.jl:345
>> extrema(x::Real) at reduce.jl:346
>> extrema(A::AbstractArray, dims) at reduce.jl:388
>> extrema(itr) at reduce.jl:362
>>
>>
>> The last line tells you that extrema will work. An object is iterable if 
>> it implements the methods start, next and done. There are in fact a few 
>> other objects that also work on generators.
>>
>>  julia> methodswith(Base.Generator)
>> 8-element Array{Method,1}:
>>  collect(itr::Base.Generator) at array.jl:298 
>>  done(g::Base.Generator, s) at generator.jl:22
>>  indices(g::Base.Generator) at generator.jl:91
>>  length(g::Base.Generator) at generator.jl:89 
>>  ndims(g::Base.Generator) at generator.jl:92  
>>  next(g::Base.Generator, s) at generator.jl:24
>>  size(g::Base.Generator) at generator.jl:90   
>>  start(g::Base.Generator) at generator.jl:21  
>>
>> There are a few functions that work on arrays but not on iterables. You 
>> should not expect these to work on generators.
>>
>> julia> show(reverse([1:10;]))
>> [10,9,8,7,6,5,4,3,2,1]
>> julia> show(reverse(i for i = 1:10))
>> ERROR: MethodError: no method matching 
>> reverse(::Base.Generator{UnitRange{Int64},##9#10})
>> Closest candidates are:
>>   reverse(!Matched::String) at strings/string.jl:209
>>   reverse(!Matched::BitArray{1}) at bitarray.jl:1416
>>   reverse(!Matched::Tuple) at tuple.jl:199
>>   ...
>>
>

Reply via email to