On Wednesday, October 28, 2015 at 8:10:41 AM UTC-4, Stefan Karpinski wrote: > > The key behavioral difference between these two is that with the > non-parametric union version you can change both the value and the type of > the field of a MyType object after construction, whereas in the parametric > version you can change the value of the field after an object has been > constructed, but not the type – since the object is either a MyType{Int} or > a MyType{Float64}. >
Given that reasoning, is there any reason to have an immutable with fields that have abstract/unspecified types? Isn't it always better to use a parametric type? > > On Wed, Oct 28, 2015 at 3:21 AM, Gnimuc Key <gnim...@gmail.com > <javascript:>> wrote: > >> that makes sense. many thanks! >> >> 在 2015年10月28日星期三 UTC+8下午3:14:26,Tomas Lycken写道: >> >>> With a type declared like that, any access of the field x will be type >>> unstable, which means that Julia’s JIT compiler will emit much more >>> defensive, and thus slower, code. >>> >>> The solution is to declare a *parametric* type: >>> >>> type MyType{T<:Union{Int64, Float64}} >>> x::T >>> end >>> >>> That way, MyType(3) and MyType(3.0) will now be instances of different >>> types, and the compiler can generate fast code. (You can still write >>> functions that dispatch on just MyType, so you don’t loose any >>> expressive power…) >>> >>> // T >>> >>> On Wednesday, October 28, 2015 at 5:10:09 AM UTC+1, Gnimuc Key wrote: >>> >>> Avoid type Unions in fields ¶ >>>>> >>>>> <http://docs.julialang.org/en/latest/manual/style-guide/#avoid-strange-type-unions> >>>>> type MyType >>>>> ... >>>>> x::Union{Void,T} >>>>> end >>>> >>>> >>>> I'm wondering whether it's a good style or not to write something like >>>> this: >>>> >>>> type MyType >>>> ... >>>> x::Union{Int64,Float64}end >>>> >>>> what's the side effects of using Union like this? >>>> >>> >>> >> >