I have a bit of contrived example of where I have parametric type on parametric type. I have the following types expressing unbound and bound distributions:
abstract Distribution{T}
abstract UnboundDistribution{T} <: Distribution{T}
abstract BoundDistribution{T} <: Distribution{T}
Type parameter T is mainly to distinguish two main uses: some computation is performed numerically but some can be performed symbolically via SymPy. So, sometimes T is SymPy.Sym, and sometimes T <: Real.
Things get complicated when I consider truncated distribution: previously unbound (e.g. log-normal) distribution that was bound “artificially” by transforming the variable. For this I have the type:
type TruncatedDistribution{U,T <: UnboundDistribution{U}} <: AbstractTruncatedDistribution{U}
d :: T{U}
xmax :: U
end
What I want to express here is that the resulting type is going to be bound and parameterized by a type U (SymPy.Sym or <: Real depending on use), internally it contains an unbound distribution, parameterized by the same type U and maximum value of the variable of the same type U.
Julia (0.5) does not allow me to do this. There are two problems here:
- I cannot refer to
Uwhen I specifyT, i.e. this:T <: UnboundDistribution{U}is not allowed, and - I cannot say
T{U}when definingd
If 1 were allowed, I wouldn’t need 2.
Is there a way to express all the constraints I want?