Tamas Papp
unread,Oct 26, 2016, 9:07:58 AM10/26/16Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to julia-users
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)