Here are some notes, mostly for my future self when I need to refer back to this
The tensor Hom adjunction is pretty cool.
Vect_K is a category whose objects are vector spaces over a field K and whose morphisms are linear maps.
Think of two linear maps between vector spaces: F: U\to V and G: U\to V. These can be combined linearly
H = \alpha F + \beta G
to get a new linear map H: U\to V. Therefore, the set of all linear maps U\to V forms a vector space we denote as [U,V]. This vector space is referred to as an internal hom.
Also, the field K itself is a vector space.
Hence, K, U, V and [U,V] are all objects (vector spaces) in Vect_K.
The tensor Hom adjunction says that for any three vector spaces U, V and W, we have
[V\otimes U, W]\cong[V,[U,W]].
If we let L_U: Vect_K\to Vect_K denote a functor given by
V\mapsto V\otimes U
and R_U: Vect_K\to Vect_K denote a functor given by
W\mapsto [U,W],
the tensor Hom adjunction is a little more suggestive
[L_U(V),W] \cong [V,R_U(W)]
and we see that “tensor product with U” and “maps from U” are adjoint (or adjunct).
Given a vector space U, its dual U^* is defined as the internal hom [U,K], i.e. all linear maps from U to K, which as we saw above is also a vector space.
Now consider the tensor Hom adjunction with V = K and W = K. Then we have
[K\otimes U,K] \cong [K, [U,K]] = [K,U^*].
However, K\otimes U \cong U so we can rewrite the tensor Hom adjunction simply as
U^* = [U,K] \cong [K,U^*].
Replacing U with U^* and noting that U^{**}\cong U, we have
U \cong [U^*,K] \cong [K,U].
This says the vector space of maps from U^* to K is equivalent to the vector space of maps from K to U and both vector spaces are equivalent to U.
This was the final missing piece for me.
So if I summarize,
TensorKit.jl defines a tensor as \tau\in [K,U].
TensorAlgebra.jl defines a tensor as \tau\in [U^*,K].
Since [K,U] and [U^*,K] are equivalent, both packages are mathematically correct, but the choice leads to different implementations.
One advantage of defining tensors as maps U^*\to K is that it seems to be easier to support partial evaluation / currying, which is an important operation for tensor algebra.