duality pairing
The duality pairing is the simplest possible way to combine a functional and a vector into a number: just evaluate. Write it <f, v> = f(v), with f in V* on the left and v in V on the right. It is the canonical bridge between the two spaces, and unlike an inner product it needs no extra structure — it is built into duality itself.
It is bilinear, meaning linear in each slot separately: <f + g, v> = <f, v> + <g, v> and <f, a*v> = a*<f, v>, and likewise on the other side. This makes it look and behave like an inner product, but it pairs two DIFFERENT spaces (V* with V), not a space with itself, so there is no notion of <f, f> or of length.
Its decisive property is non-degeneracy: if <f, v> = 0 for every f, then v = 0; and if <f, v> = 0 for every v, then f = 0. Neither side has a 'blind spot' the other cannot detect. Non-degeneracy is exactly what makes the evaluation map injective and powers every duality theorem.
Once you adopt the bracket, statements gain a pleasing symmetry. The transpose is defined by <g, T v> = <T* g, v>, moving T across the pairing; the annihilator U^0 is the f with <f, u> = 0 for all u in U. The whole theory is bookkeeping with one honest bracket.
The pairing evaluates a functional on a vector and lets you slide a map across it.
The pairing <f, v> looks like an inner product but is not one: it joins two different spaces, is not symmetric (the slots are typed differently), and offers no length. An inner product is the special case where a chosen identification of V with V* lets you pair V with itself.