  The tensor notation used in several areas of mathematics is a useful one, but
it is not widely available to the functional programming community. In a
practical sense, the (embedded) domain-specific languages (DSLs) that are
currently in use for tensor algebra are either 1. array-oriented languages that
do not enforce or take advantage of tensor properties and algebraic structure
or 2. follow the categorical structure of tensors but require the programmer to
manipulate tensors in an unwieldy point-free notation. A deeper issue is that
for tensor calculus, the dominant pedagogical paradigm assumes an audience
which is either comfortable with notational liberties which programmers cannot
afford, or focus on the applied mathematics of tensors, largely leaving their
linguistic aspects (behaviour of variable binding, syntax and semantics, etc.)
for the reader to figure out by themselves. This state of affairs is hardly
surprising, because, as we highlight, several properties of standard tensor
notation are somewhat exotic from the perspective of lambda calculi. We bridge
the gap by defining a DSL, embedded in Haskell, whose syntax closely captures
the index notation for tensors in wide use in the literature. The semantics of
this EDSL is defined in terms of the algebraic structures which define tensors
in their full generality. This way, we believe that our EDSL can be used both
as a tool for scientific computing, but also as a vehicle to express and
present the theory and applications of tensors.
