First, thanks for getting this started, @rxwei. Exciting!
I'm on vacation, so any notes from me are going to come in spurts while the baby is sleeping. Here's the first batch, focusing on VectorNumeric:
associatedtype ScalarElement
Shouldn't ScalarElement be constrained to be Arithmetic? If not, why not?
associatedtype Dimensionality
This is really a shape, rather than dimension; having an associated type called Dimensionality seems misleading, because the dimension of a (finite-dimensional) vector space is always an integer. The dimension of the vector space of 2x3 matrices over the real numbers is 6, not [2,3]. Can we call this associatedtype Shape instead? Or is there some reason you are avoiding that term?
/// Create a scalar in the real vector space that the type represents.
///
/// - Parameter scalar: the scalar
init(_ scalar: ScalarElement)
I don't understand what this does. Scalars aren't in "the vector space that the type represents." They're objects of a different type entirely. Also, you use "real vector space" fairly pervasively in the comments for this protocol, but AFAIK you want to represent vector spaces (or even modules) over arbitrary fields (rings).
init(repeating repeatedValue: ScalarElement, dimensionality: Dimensionality)
/// The dimensionality of this vector.
var dimensionality: Dimensionality { get }
Again, these would make more sense as shape: Shape.
/// Returns the scalar product of the vector.
static func * (scale: ScalarElement, value: Self) -> Self
I'm assuming that Self * ScalarElement and Self *= ScalarElement would be defaulted as well, is that correct?