"$identifier" names a substitution placeholder matching a
mapping key of "identifier". "identifier" must spell a
Haskell identifier. The first non-identifier character after the
"$" character terminates this placeholder specification.

"${identifier}" is equivalent to "$identifier". It is
required when valid identifier characters follow the placeholder
but are not part of the placeholder, such as
"${noun}ification".

Any other apperance of "$" in the string will result in an
error being raised.

If you render the same template multiple times it's faster to first
convert it to a more efficient representation using template and
then render it using render. In fact, all that substitute does
is to combine these two steps.