Le mardi 29 avril 2014 à 11:51 -0400, Stefan Karpinski a écrit :
[...]
>      1. 
>         
> The explicit distinction between A – the actual parameter type of x –
> and B, which is simply an upper bound on A, becomes clearer in
> situations like this:
> 
> 
>         frob{A<:B}(x::P{A}, y::A)
>         frob{A<:B}(x::P{A}, y::B)
> 
> 
> The first definition only applies to x and y where y is of the actual
> parameter type of x and thus could be used as is by x. The second
> definition applies when y is of type B, regardless of x's actual
> parameter type, which means that it might not be usable as is by x.
> 
> 
> We could actually make parametric types covariant without losing the
> ability to express this distinction; it would just mean that the
> second definition could be written as:
> 
> 
>         frob(x::P{B}, y::B)
> 
> 
> Currently, this means that x must have exact parameter type B; if
> types were covariant then it would mean that x's parameter type could
> be any A <: B. Although it may seem questionable that y not be of the
> true parameter type of x, allowing this wiggle room and then doing
> conversion at run-time as necessary is actually the standard way to do
> things in Julia. Conversion is often done implicitly by assignment to
> a type location such as a field of x or an array slot. The fact that
> this is quite common is why covariance might actually be ok. The main
> thing we would lose with parametric covariance is the ability to talk
> about arrays that are of *exactly* element type B where B is some
> abstract type. But I'm just not sure how useful that actually is.
> Those types are generally discouraged in any case and it's rare to
> want to give them special behaviors that wouldn't also apply to
> parametric types with concrete parameters. So perhaps we ought to
> consider making parametric types in Julia covariant.
I am very sympathetic to such as change, but one reason why making e.g.
frob(x::Array{B, 1}, y::B) be equivalent to frob{T<:B}(x::Array{T, 1},
y::B), B being abstract, would be a problem, is that the function code
couldn't rely on the assumption that the x vector can hold any value of
type B. Indeed, x could be either an Array{B, 1} or an Array{T, 1} with
T any concrete type as long as T<:B.

Cf. https://github.com/JuliaLang/julia/issues/6248#issuecomment-38435635
(and the following discussion)

In practice, I really don't think this would matter in many occasions.
So maybe it would be a good change, if there was a syntax to specify
that the function really expects an Array{B, 1}. Or maybe the latter
isn't even useful as the function can always call convert() if it's
really needed (can we find use cases for it).

I believe this detail is one of the (quite rare) frustrating points when
one starts coding in Julia. So it would be worth investigating for
Julia's coming success.

Reply via email to