See https://github.com/JuliaLang/julia/issues/18466#issuecomment-246713799
On Wed, Sep 14, 2016 at 6:13 PM, Dan <[email protected]> wrote: > 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 >> >>
