Working on the finite field code I found myself asking "what is a Number?".
One answer is: julia> Base.subtypetree(Number) (Number,{(Complex{Float16},{}),(Complex{Float32},{}),(Complex{Float64},{}),( Complex{T<:Real},{}),(Real,{(FloatingPoint,{(BigFloat,{}),(Float16,{}),( Float32,{}),(Float64,{})}),(Integer,{(BigInt,{}),(Bool,{}),(Char,{}),(Signed ,{(Int128,{}),(Int16,{}),(Int32,{}),(Int64,{}),(Int8,{})}),(Unsigned,{( Uint128,{}),(Uint16,{}),(Uint32,{}),(Uint64,{}),(Uint8,{})})}),(MathConst{ sym},{}),(Rational{T<:Integer},{})})}) but that doesn't help so much. What I really wanted to know is - what methods are assumed to exist for something that is a subtype of Number? And I don't know how to answer that. Maybe (I don't think so) Julia needs some kind of concept like abstract methods, where you can name methods for Number that any subtype must implement? Maybe there needs to be some kind of tool that introspects the code base and says "90% of subtypes define real and abs"? Maybe this has already been discussed or is clearly not an issue? Andrew