2017-01-03 3 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

Как говорится в сообщении, U является TypeVar, а не 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}}} ', но треугольная отправка до сих пор не поддерживается в julia. в настоящее время вы можете использовать 'type A {T, U <: Union {X, Y}}' + внутренний конструктор в качестве обходного пути. надеюсь, у нас будет треугольная отправка [в julia-0.6] (https://github.com/JuliaLang/julia/issues/6984#issuecomment-49751358). – Gnimuc

+1

Я считаю, что мастер в настоящее время имеет треугольную отправку, поэтому он определенно должен быть в 0,6 –

Смежные вопросы