On Wed, Aug 26, 2015 at 12:44 PM, Sisyphuss <[email protected]> wrote:
> Of course, I know how to write the valid code.
>
> But in the interactive environment, if someone accidentally defines the
> promote_rule in the non-base way, he will find himself in an
> incomprehensible situation.

There's too many things you can accidentally do to break normal
functions in current scope and I don't think this one is particularly
bad.

```
julia> + = 1
1

julia> 1 + 2
ERROR: MethodError: `call` has no method matching call(::Int64,
::Int64, ::Int64)
Closest candidates are:
 Union(::Any...)
 BoundsError(::Any...)
 TypeVar(::Any...)
 ...
```

>
>
> On Wednesday, August 26, 2015 at 4:15:59 PM UTC+2, Luthaf wrote:
>>
>> By doing
>>
>>     promote_rule() = 1
>>
>> And then
>>
>>     Base.promote_rule{T}(::Type{A{T}},::Type{C{T}}) = C{T}
>>
>> You are defining two different functions. Only the second one is used by
>> the promotion system.
>>
>> The valid code is
>>
>>     abstract B
>>     type A<:B
>>     end
>>
>>     type C<:B
>>     end
>>
>>     Base.promote_rule(::Type{A},::Type{ C}) = C
>>
>>     @assert promote_type(A,C) == C
>>
>> Sisyphuss a écrit :
>>
>> In other words, it "won't fix"?
>>
>> On Wednesday, August 26, 2015 at 6:41:36 AM UTC+2, Stefan Karpinski wrote:
>>
>> Don't do the first non-base definition.
>>
>> On Wed, Aug 26, 2015 at 12:27 AM, Sisyphuss <[email protected]> wrote:
>>
>> This modification works, but it fails sometimes:
>>
>> abstract B{T}
>>
>> type A{T}<:B{T}
>> end
>>
>> type C{T}<:B{T}
>> end
>>
>> promote_rule() = 1
>> promote_rule()
>> @assert promote_type(A{Real},C{Real}) == B{Real}
>>
>> Base.promote_rule{T}(::Type{A{ T}},::Type{C{T}}) = C{T}
>> @assert promote_type(A{Real},C{Real}) == B{Real}
>> @assert promote_type(A{Int},C{Int}) == C{Int}
>>
>> The behavior of `promote_rule` for the abstract parametric type is
>> disrupted by the earlier weird non-Base `promote_rule`. (Environment:
>> JuliaBox)
>>
>> By the way, why I can define `promote_rule`, but when I try to define
>> `promote_type`, it raises an error?
>>
>>
>>
>>
>> On Wednesday, August 26, 2015 at 5:25:50 AM UTC+2, Tim Holy wrote:
>>
>> Add `Base.` in front of `promote_rule`.
>>
>> --Tim
>>
>> On Tuesday, August 25, 2015 08:23:40 PM Sisyphuss wrote:
>> > abstract B
>> >
>> > type A<:B
>> > end
>> >
>> > type C<:B
>> > end
>> >
>> > promote_rule(::Type{A},::Type{ C}) = C
>> >
>> > @assert promote_type(A,C) == B
>> >
>> > Whether I define the promotion_rule or not, the promote_type is always
>> > B.
>>
>>
>

Reply via email to