> > However, if I want to compute types directly in the definition (see third > implementation), I end up with a TypeVar object I don't know how to deal > with (even though I read the "More about types" section in the manual, > sorry). Is this even possible?
Not yet: https://github.com/JuliaLang/julia/issues/18466 On Wed, Oct 26, 2016 at 9:07 AM, Tamas Papp <tkp...@gmail.com> wrote: > I have a type which contains two slots, and it is important that the > types of them satisfy certain constraints. I can enforce that in the > constructor: see first and second implementations below. However, if I > want to compute types directly in the definition (see third > implementation), I end up with a TypeVar object I don't know how to deal > with (even though I read the "More about types" section in the manual, > sorry). Is this even possible? > > [Note: I also asked on Gitter, but did not get a solution, or an > explanation.] > > # first implementation: dd1 maps values to types > # uses constructor to constrain, works > > dd1(::Int) = Float64 # for the sake of example > > immutable Foo1{T,S} > a::T > b::Set{S} > function Foo1{T,S}(a::T, b::Set{S}) > @assert S ≡ dd1(a) > new(a, b) > end > end > > Foo1{T,S}(a::T, b::Set{S}) = Foo1{T,S}(a,b) > > Foo1(1, Set([9.0])) # OK > foo1(1, Set(9)) # error > > # second implementation: dd2 maps types to types > # uses constructor to constrain, works > > dd2(::Type{Int}) = Float64 > > immutable Foo2{T,S} > a::T > b::Set{S} > function Foo2{T,S}(a::T, b::Set{S}) > @assert S ≡ dd2(T) > new(a, b) > end > end > > Foo2{T,S}(a::T, b::Set{S}) = Foo2{T,S}(a,b) > > Foo2(1, Set([9.0])) # OK > Foo2(1, Set(9)) # error > > # third implementation, types to types > > immutable Foo3{T,S} > a::T > b::Set{dd2(T)} > end > ## ERROR: MethodError: no method matching dd2(::TypeVar) >