Suppose I have a type called MyType that has one floating point field "x". When constructed, if the value provided for "x" is greater than, let's say, 5, it has pi subtracted from it. For example,
a = MyType(4) # x = 4.0 b = MyType(-11) # x = 11.0 c = MyType(10) # x = 6.8584 d = MyType(-1.443) # x = -1.443 What is the best way to declare MyType and its constructor(s) to ensure that: 1. You can provide MyType with any real number to construct it 2. typeof(a.x) and typeof(c.x) are both Float64 3. The pi constraint is properly applied (is an inner constructor appropriate here?) 4. The same behaviour applies to the entries of a second field "y" that is a vector (e.g., MyType(10, [3, 10, 11, -2]) has x = 6.8584, y = [3.0, 6.8584, 7.8584, -2.0]). 5. (if possible) You can construct MyType from a mixture of real number types (e.g., MyType(11.4, [1, 2, 55])) 6. MyType has a third field "z" that is a string Here is an implementation I wrote that doesn't meet 1, 5, or 6: function subtractpi(x::Real) x, y = promote(x, x - pi) return x > 5 ? y : x end immutable MyType{T<:FloatingPoint} x::T v::Vector{T} function MyType(x, v) x = subtractpi(x) v = map(subtractpi, v) new(x, v) end end MyType{T<:FloatingPoint}(x::T, v::Vector{T}) = MyType{T}(x, v) Thanks. I am working on my understanding of types in Julia.