2017-01-03 110 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 –