This package currently exports a tiny function base_numeric_type that
extracts the base numeric type from a numeric type T:
- base_numeric_type(::Type{T}) where {T}
- base_numeric_type(x::T)
For example,
| Input Type | Output Type | 
|---|---|
| Float32 | Float32 | 
| ComplexF32 | Float32 | 
| Measurement{Float32} | Float32 | 
| Dual{BigFloat} | BigFloat | 
| Dual{ComplexF32} | Float32 | 
| Rational{Int8} | Int8 | 
| Quantity{Float32, ...} | Float32 | 
| Quantity{Measurement{Float32}, ...} | Float32 | 
Package maintainers should write a specialized method for their type. For example, to define the base numeric type for a dual number, one could write:
import BaseType: base_numeric_type
base_numeric_type(::Type{Dual{T}}) where {T} = base_numeric_type(T)It is important to call base_numeric_type recursively like this to deal with
nested numeric types such as Quantity{Measurement{T}}.
The fallback behavior of base_numeric_type is to return the first type parameter,
or, if that type has parameters of its own (such as Dual{Complex{Float32}}),
to recursively take the first type parameter until a non-parameterized type is found.
This works for the vast majority of types, but it is still preferred
if package maintainers write a specialized method.