Неудачный вызов массива абстрактного типа - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь использовать в своих лучших параметризации и типах в Юлии. У меня есть конструктор, который имеет в качестве аргументов массив T и массив Interval{T,Bound{T},Bound{T}}, где T - это реальный тип, а Bound - абстрактный тип, из которого получены OpenBound и NullBound.

Однако, когда я пытаюсь вызвать этот конструктор, я получаю следующую ошибку:

   ERROR: MethodError: no method matching 
   HyperParameters(::Array{Float64,1}, 
   ::Array{Interval{Float64,OpenBound{Float64},NullBound{Float64}},1})
   Closest candidates are:
   HyperParameters(::Array{T<:Real,1}, ::Array{Interval{T<:Real,A,B} where 
   B<:Bound{T<:Real} where A<:Bound{T<:Real},1}) where T<:Real

Хотя этого не происходит для конструктора, не использующего массивы (просто T и Interval{T,Bound{T},Bound{T}}). Я использую Юлию 0.6.2. Есть идеи, как это решить? Спасибо!

Théo

1 Ответ

0 голосов
/ 26 апреля 2018

Причина в том, что типы в Юлии инвариантны. Более простой пример вашей проблемы: Vector{Vector{Int}} не является подтипом Vector{AbstractVector{Int}}, а Vector{Int} является подтипом AbstractVector{Int}. Однако Vector{Vector{Int}} является подтипом Vector{<:AbstractVector{Int}}.

Поэтому решение вашей проблемы:

julia> abstract type Bound{T} end

julia> struct OpenBound{T} <: Bound{T} end

julia> struct NullBound{T} <: Bound{T} end

julia> struct Interval{T,A,B} end

julia> HyperParameters(::Vector{T}, ::Vector{Interval{T,A,B}}) where {B<:Bound{T}, A<:Bound{T}} where T<:Real = "OK"
HyperParameters (generic function with 1 method)

julia> x = [1.0]
1-element Array{Float64,1}:
 1.0

julia> y = [Interval{Float64, OpenBound{Float64}, NullBound{Float64}}()]
1-element Array{Interval{Float64,OpenBound{Float64},NullBound{Float64}},1}:
 Interval{Float64,OpenBound{Float64},NullBound{Float64}}()

julia> HyperParameters(x, y)
"OK"

К сожалению, вы не опубликовали свои определения типов (что я бы порекомендовал вам сделать в будущем), поэтому я должен использовать здесь искусственные определения.

...