`VectorNumeric` Type: In General & `Complex` Numbers

The "complex numbers", when considered just as a real vector space, are really not the same thing as the actual complex numbers: they're isomorphic as groups, but the complex numbers are a field with an associated multiplicative operation that is not defined on R^2. In fact, a well-behaved multiplication doesn't even exist for many vector spaces (that's why the quaternions are only a division ring, not a field). So it's IMHO totally wrong to equate the two in any sort of way: yes, you can (and usually will) represent complex numbers as R^2, but you do different things on them and you do usually want to keep track of R^2 vectors and complex numbers separately.

The same goes for real numbers as 1-d real vectors; again you can do things to real numbers (e.g. dividing) that you don't want to do to vectors.

As for whether VectorNumeric should be a protocol ... the way I understand your definition it's just a vector space endowed with an inner product. Mathematically this is called an inner product space (or sometimes pre-Hilbert space, but that name is probably quite off-putting). I would be fine with having a type called e.g. DotProductSpace, but VectorNumeric sounds too much like Numeric, which is sort of like a ring, whereas a vector space with an inner product categorically isn't ("multiplying" two vectors gives you a scalar instead of a vector).

So my personal answer to your questions:

  1. Possibly, but not under the name VectorNumeric
  2. No, that would be mathematically very misleading
  3. Same. And also, IMHO you really don't want to have an operation on a protocol that only makes sense for a very limited subset of implementers of that protocol. Complex conjugates belong to complex numbers, there's no real reason why this should be defined outside of that type.
5 Likes