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.

Reply via email to