2017-01-03 163 views
3

假設我有類型如何在參數類型上定義參數類型?

immutable X{T} 
    a::T 
end 

immutable Y{T} 
    a::T 
end 

我想這樣做

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

這樣的情況下,可能是A(X(a), a)A(Y(a), a)

它不能作爲工作 LoadError: TypeError: Type{...} expression: expected Type{T}, got TypeVar

它的正確方法是什麼?

回答

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 <:Union {X {T},Y {T}}}',但現在茱莉亞仍然不支持三角形調度。目前,您可以使用類型A {T,U <:Union {X,Y}} +內部構造函數作爲解決方法。希望我們會有三角派遣[在茱莉亞-0.6](https://github.com/JuliaLang/julia/issues/6984#issuecomment-49751358)。 – Gnimuc

+1

我相信主人目前有三角派,所以一定要在0.6 –