Я хотел бы использовать подтип параметра функции в определении моей функции. Это возможно? Например, я хотел бы написать что-то вроде:Могу ли я использовать подтип параметра функции в определении функции?
g{T1, T2<:T1}(x::T1, y::T2) = x + y
Так что g
будет определена для любого x::T1
и любого y
, который является подтипом T1
. Очевидно, если бы я знал, например, что T1
всегда будет Number
, тогда я мог бы написать g{T<:Number}(x::Number, y::T) = x + y
, и это будет работать нормально. Но этот вопрос касается случаев, когда T1
неизвестен до времени выполнения.
Читайте дальше, если вам интересно, почему я хотел бы сделать это:
Полное описание того, что я пытаюсь сделать, было бы немного громоздким, но то, что следует, является упрощенным примером.
У меня есть параметризованные типа, и простой метод, определенный в течение этого типа:
type MyVectorType{T}
x::Vector{T}
end
f1!{T}(m::MyVectorType{T}, xNew::T) = (m.x[1] = xNew)
У меня также есть другой тип, с абстрактным супер-типа определяется следующим
abstract MyAbstract
type MyType <: MyAbstract ; end
я создаю экземпляр MyVectorType
с типом векторного элемента, установленным на MyAbstract
с использованием:
m1 = MyVectorType(Array(MyAbstract, 1))
Теперь я хочу разместить экземпляр MyType
в MyVectorType
. Я могу это сделать, начиная с MyType <: MyAbstract
. Однако я не могу это сделать с f1!
, так как определение функции означает, что xNew
должно быть типа T
, а T
будет MyAbstract
, а не MyType
.
Два решения я могу думать о том, чтобы этой проблемы являются:
f2!(m::MyVectorType, xNew) = (m.x[1] = xNew)
f3!{T1, T2}(m::MyVectorType{T1}, xNew::T2) = T2 <: T1 ? (m.x[1] = xNew) : error("Oh dear!")
Первый, по существу, утка-типирование решение. Второй выполняет соответствующую проверку ошибок на первом шаге.
Какой? Или есть третье, лучшее решение, о котором я не знаю?
Очень полезный ответ - я многому научился. Большое спасибо. –