What's wrong with quasiquoting? Check out ShakespeareShakespeare (as mentioned in comments):
{-# LANGUAGE QuasiQuotes #-}
import Text.Shakespeare.Text
import Data.Text
runtimeInterpolatedString :: (ToText a, ToText b, ToText c) => a -> b -> c -> Text
runtimeInterpolatedString a b c = [lt|There once was #{a} that #{b} when #{c}.|]