no. that misses the usefulness of abstract types. Here's the answer:

abstract A{S}
type B{T} <: A{T} end
typealias C{T<:A} Ptr{T}
z = Ptr{B{Int}}

import Base.eltype
eltype{T}(::Type{A{T}}) = T
eltype{T<:A}(::Type{T}) = eltype(super(T))
eltype{T}(::Type{C{T}}) = eltype(T)

julia> eltype(z)
Int64

On Tue, Feb 11, 2014 at 10:45 AM, Tim Holy <tim.h...@gmail.com> wrote:
> Does this do it?
>
> ptype{T}(::Type{Ptr{T}}) = T
> btype{T}(b::Type{B{T}}) = T
> btype(ptype(z))
>
> (One way or another, that is one torturous type nest!)
>
> --Tim
>
> On Monday, February 10, 2014 11:26:33 PM Jameson Nash wrote:
>> I can't figure this out, so I'm hoping someone will be able to help
>> suggest a better way to parametrize this code, or solve my dilemma.
>> I've made a somewhat complicate type hierarchy, and now I need to
>> extract some information from it. The problem is, given z (or an
>> instance thereof), I can't seem to extract S:
>>
>>
>> julia> abstract A{S}
>>
>> julia> type B{T} <: A{S} end
>>
>> julia> typealias C{T<:A} Ptr{T}
>> Ptr{T<:A{T}}
>>
>> julia> z = Ptr{B{Int}}
>> Ptr{B{Int64}}
>>
>> julia> # how to go from z -> Int here

Reply via email to