Maybe the following is the form you are looking for:
julia> decomplexify{T}(::Type{Complex{T}}) = T
decomplexify (generic function with 1 method)
julia> type bar{S,T}
sum::S
sumsqr::T
function bar(s,ss)
if typeof(ss) != decomplexify(typeof(s))
error("Yaiks")
end
new(s,ss)
end
end
julia> bar{Complex{Float64},Float64}(1.5+2.0im,1.0)
bar{Complex{Float64},Float64}(1.5 + 2.0im,1.0)
julia> bar{S,T}(x::S,y::T) = bar{S,T}(x,y)
bar{S,T}
julia> bar(1.5+2.0im,1.0)
bar{Complex{Float64},Float64}(1.5 + 2.0im,1.0)
The outer constructor is necessary to get the last line working. The inner
constructor basically maintains the constraint between S and T of: T ==
Complex{S}.
On Wednesday, September 14, 2016 at 3:38:53 PM UTC-4, Neal Becker wrote:
>
> Evan Fields wrote:
>
> > How about something like the following?
> >
> > type CT{T}
> > ctsum::Complex{T}
> > ctsumsq::T
> > end
> >
>
> I'm aware that it's easier to make the type parameter the scalar type,
> allowing writing as you show, but as a learning exercise I'd like to know
> how Julia would go the other way.
>
> In c++ this would be done with template metaprogramming, but as Julia
> claims
> to have types as 1st class objects, I thought there should be some elegant
> way to do this.
>
> That is, given T is Complex{U}, I need the type U so I can write
> ctsumsq::U
>
>