2017-01-03 6 views
3

は私がインスタンスがA(X(a), a)またはA(Y(a), a)パラメトリック型よりもパラメトリック型を定義する方法は?

することができるように、それは LoadError: TypeError: Type{...} expression: expected Type{T}, got TypeVar

として動作しません

type A{T, U} 
    x::U{T} 
    y::T 
end 

ような何かをしたいと思い種類

immutable X{T} 
    a::T 
end 

immutable Y{T} 
    a::T 
end 

を持っていると仮定します

どのような方法が適切ですか?

答えて

2

エラーとして、UTypeVarで、Typeではありません。答えはUを実際のタイプにすることです:

julia> abstract U{T} 

julia> immutable X{T} <: U{T} 
      a::T 
     end 

julia> immutable Y{T} <: U{T} 
      a::T 
     end 

julia> type A{T} 
      x::U{T} 
      y::T 
     end 

julia> A(X(1),1) 
A{Int64}(X{Int64}(1),1) 

julia> A(X(1),1.) 
ERROR: MethodError: no method matching A{T}(::X{Int64}, ::Float64) 
Closest candidates are: 
    A{T}{T}(::U{T}, ::T) at REPL[4]:2 
    A{T}{T}(::Any) at sysimg.jl:53 

julia> A(Y(1),1) 
A{Int64}(Y{Int64}(1),1) 
+0

しかし、A.xは具体的なタイプではなく抽象タイプです。それはパフォーマンスを傷つけませんか? – colinfang

+0

@colinfang私はあなたが実際にこのタイプA {T、U <:ユニオン{​​X {T}、Y {T}}} 'のようなものを探していると思いますが、今のところジュリアでは三角ディスパッチはまだサポートされていません。回避策として 'type {{T、U <:Union {X、Y}}' +内部コンストラクタを使用することができます。うまくいけば、三角形のディスパッチ[julia-0.6](https://github.com/JuliaLang/julia/issues/6984#issuecomment-49751358)があります。 – Gnimuc

+1

私はマスターが現在三角ディスパッチを持っていると思うので、間違いなく0.6 –

関連する問題