I assumed the content of the vector were the angles, and that you wanted to 
abstract the sequence of application of those angles -- your 321.
If you do not want to fix the type (you should have a good reason, Julia is 
more at ease when the type is not Any) -- just remove 'Float64'

type EulerRotation{I,J,K}
      angles::Vector{Any}
end

typealias EulerRot321 EulerRotation{3,2,1}
typealias EulerRot123 EulerRotation{1,2,3}

function getEulerAngles(x::EulerRotation)
       p = typeof(x).parameters
       [x.angles[i] for i in p]
end

testEulerRot321 = EulerRot321([10,20,30])
testEulerRot123 = EulerRot123([10//7,20//7,30//7])

julia> getEulerAngles(testEulerRot321)
3-element Array{Any,1}:
 30
 20
 10

julia> getEulerAngles(testEulerRot123)
3-element Array{Any,1}:
 10//7
 20//7
 30//7

if your vectors are always uniformly typed, you can do this to avoid 
passing around Vector{Any}

function getEulerAngles(x::EulerRotation)
       p = typeof(x).parameters
       t = typeof(x.angles[1])
       (t)[x.angles[i] for i in p]
end

julia> getEulerAngles(testEulerRot321)
3-element Array{Int64,1}:
 30
 20
 10

If you are trying to accomplish something else, let me know using different 
words.

On Wednesday, August 26, 2015 at 12:26:44 AM UTC-4, [email protected] 
wrote:
>
> I think the part that is making things difficult for me is that I'm not 
> assuming Float64.  I could do it by calling the inner constructor, like you 
> do in your example, but I think I'd have to explicitly give the element 
> type:
>
> EulerAngles{Float64, 321}([10.0, 20.0, 30.0])
>
> I know that you can use an outer constructor so that the type of the 
> arguments determines the type parameter used.  But it isn't clear how to do 
> that if the arguments give only a subset of the type parameters, and the 
> rest need to be given explicitly.  I was wondering if that is maybe just 
> not possible.
>
> In my original post, my [1.0, 2.0, 3.0] array is the Euler angles 
> themselves.  I can see how that could be confused for the Euler sequence, 
> so here I used [10.0, 20.0, 30.0] instead.
>
> On Tuesday, August 25, 2015 at 11:11:34 PM UTC-5, Jeffrey Sarnoff wrote:
>>
>> Are you looking to do this?
>>
>> julia> type EulerRotation{I,J,K}
>>           angles::Vector{Float64}
>>        end
>>
>> julia> function getEulerAngleSeq(x::EulerRotation)
>>            p = typeof(x).parameters
>>            Float64[x.angles[i] for i in p]
>>        end
>> getEulerAngleSeq (generic function with 1 method)
>>
>> julia> testRotSeq321 = EulerRotation{3,2,1}([1.0,2.0,3.0])
>> EulerRotation{3,2,1}([1.0,2.0,3.0])
>>
>> julia> getEulerAngleSeq(testRotSeq321)
>> 3-element Array{Float64,1}:
>>  3.0
>>  2.0
>>  1.0
>>
>> julia> testRotSeq132 = EulerRotation{1,3,2}([1.0,2.0,3.0])
>> EulerRotation{1,3,2}([1.0,2.0,3.0])
>>
>> julia> getEulerAngleSeq(testRotSeq132)
>> 3-element Array{Float64,1}:
>>  1.0
>>  3.0
>>  2.0
>>
>>
>>
>> On Tuesday, August 25, 2015 at 11:29:08 PM UTC-4, [email protected] 
>> wrote:
>>>
>>> Hi, everyone.
>>>
>>> I've been tinkering with creating a package for dealing with Euler 
>>> angles, using a very recent build of v0.4.  Rather than just rehash 
>>> Matlab's functions, I wanted to take advantage of the type system, to learn 
>>> more about parametric types and constructors.
>>>
>>> I definitely want the Euler rotation sequence and the angles to be bound 
>>> together.  One straightforward way to do this would of course be:
>>>
>>> type EulerAngles{T <: Number}
>>>     seq::Int
>>>     angles::Vector{T}
>>> end
>>>
>>> Which would work fine, but I'd end up with a huge if block for every 
>>> valid sequence.  So I thought I'd try moving the sequence into the type 
>>> definition.  I think I would declare the type like this:
>>>
>>> type EulerAngles{T <: Number, s}
>>>     angles::Vector{T}
>>> end
>>>
>>> But then I can't figure out the best way to provide constructors for 
>>> this type.  What I want is something like this:
>>>
>>> EulerAngles{321}([1.0, 2.0, 3.0])
>>>
>>> But I can't figure out how to get this to work.  Is this kind of 
>>> constructor even possible with the type I showed above?
>>>
>>> I was able to get something very similar to work, by making functions 
>>> that look like constructors with the sequence in their names, like this:
>>>
>>> EulerAngles321([1.0, 2.0, 3.0])
>>>
>>> Which works, but gives the impression that EulerAngles321 is actually a 
>>> type.  But it seems that typealiases can't have constructors, and I get an 
>>> error trying to define a typealias and a function with the same name.  Even 
>>> with this limitation, though, this seems like an OK solution.
>>>
>>> If I really wanted to have types with those names, I could have an 
>>> abstract EulerAngles type, and then have concrete types like 
>>> EulerAngles321.  But that seems like overkill (in terms of the number of 
>>> types I'd create).  Though it would work.
>>>
>>> Does anyone have any guidance on how to best approach this?
>>>
>>> Thanks for the help!
>>>
>>> Daniel
>>>
>>

Reply via email to