That's a fair point. It seems like it could/should be handled by the same (not-yet-implemented) mechanism that ensures that `convert(T,x)::T` is true. Of course, we could choose to enforce this fact via lowering in this case, independent of enforcing it for convert.
On Wed, Oct 12, 2016 at 7:40 PM, Cedric St-Jean <cedric.stj...@gmail.com> wrote: > 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{UnitR >>> ange{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 >>> ... >>> >>