# Control.Algebra.VectorSpace

interface VectorSpace

  A vector space is a module over a ring that is also a field

interface Module

  A module over a ring is an additive abelian group of 'vectors' endowed with a
  scale operation multiplying vectors by ring elements, and distributivity laws
  relating the scale operation to both ring addition and module addition.
  Must satisfy the following laws:

  - Compatibility of scalar multiplication with ring multiplication:
    forall a b v, a <#> (b <#> v) = (a <.> b) <#> v
  - Ring unity is the identity element of scalar multiplication:
    forall v, unity <#> v = v
  - Distributivity of `<#>` and `<+>`:
    forall a v w, a <#> (v <+> w) == (a <#> v) <+> (a <#> w)
    forall a b v, (a <+> b) <#> v == (a <#> v) <+> (b <#> v)
  (<#>) : Module a b => a -> b -> b
    Fixity
      Left associative, precedence 5
interface InnerProductSpace

  An inner product space is a module – or vector space – over a ring, with a binary function
  associating a ring value to each pair of vectors.

  (<||>) : InnerProductSpace a b => b -> b -> a
    Fixity
      Left associative, precedence 2