On Wednesday, April 30, 2014 9:13:50 PM UTC+1, Stefan Karpinski wrote:
>
> Back to the original subject, because I think there's some value in 
> summarizing it.
>
> 1. Variance. It is somewhat unintuitive to a lot of newcomers that in 
> Julia Array{Real} is a concrete type and Array{Int} is not a subtype of it. 
> It might be possible to make parametric types in Julia covariant by 
> default, but then one must either come up with a different way of writing 
> the concrete type currently known as Array{Real} or allow concrete 
> parametric types like Array{Real} to have subtypes, namely Array{T} for 
> each T <: Real. 
>

> 2. Restricting type parameters to concrete types. The variance issue was a 
> bit of a red herring. What Oliver was really after, it seems (correct me if 
> I'm wrong), was being able to ensure that the T in Array{T} is always a 
> concrete type.
>

Well, that would certainly be a solution. You could have a type modifier, 
say Concrete(Real), which returns the union of all concrete types which are 
subtypes of Real (or whatever). Then you could use:
frob{T<:Concrete(Real)}(x:Array{T})
to assert that input arrays are homogeneous.

What I would really like is to be able to write:
frob(x:Array{Concrete(Real)})
instead, because the static parameter seems as redundant to a beginner as 
it does in frob{T<:Real}(x::T). However, I understand that the two are 
different in the case of arrays/parameterized types, as the latter also 
encompasses some heterogeneous array types, and that that won't change 
unless the variance of Julia is changed. I'm not in a position to advocate 
such a thing.
 

Reply via email to