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 >> ... >> >