2016-07-20 4 views
3

Предположим, что я хочу хранить вектор I вместе со своей нормой. Я ожидал, что соответствующее определение типа, чтобы быть простым:Функция типа параметра в определении типа

immutable VectorWithNorm1{Vec <: AbstractVector} 
    vec::Vec 
    norm::eltype(Vec) 
end 

Однако, это не работает по назначению:

julia> fieldtype(VectorWithNorm1{Vector{Float64}},:norm) 
Any 

Кажется, что я должен сделать

immutable VectorWithNorm2{Vec <: AbstractVector, Eltype} 
    vec::Vec 
    norm::Eltype 
end 

и полагаться на пользователь не должен злоупотреблять параметром Eltype. Это верно?

PS: Это всего лишь придуманный пример, иллюстрирующий проблему. Это не проблема, с которой я столкнулся.

+0

Как насчет сохранения его как символа? –

+0

Не могли бы вы уточнить? – gTcV

+0

Дело в том, что вы можете выполнить проверку времени выполнения [возможность применения функции как нормы] (http://docs.julialang.org/en/latest/stdlib/base/#Base.applicable) в __constructor__, но вы не можете наложить это на тип –

ответ

2

Любые расчеты параметра типа в настоящее время не работают (хотя я действительно обсуждали этот вопрос с Джеффом Bezanson в JuliaCon, и он, казалось, поддаются фиксации его). В настоящее время проблема заключается в том, что выражение для типа norm оценивается при определении параметризованного типа и вызывается с помощью TypeVar, но оно еще не привязано к значению, которое вам действительно нужно для его вызова , в то время, когда этот параметр фактически связан с созданием конкретного типа.

Я столкнулся с этим много, где я хочу сделать некоторый расчет числа битов типа с плавающей точкой, то есть рассчитать и использовать число UInt s, необходимое для хранения значения fp конкретного и используйте NTuple{N,UInt} для хранения мантиссы.

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