computation on types in type definition

41 views
Skip to first unread message

Tamas Papp

unread,
Oct 26, 2016, 9:07:58 AM10/26/16
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)

Isaiah Norton

unread,
Oct 26, 2016, 9:20:09 AM10/26/16
to julia...@googlegroups.com
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?

Reply all
Reply to author
Forward
0 new messages