Such an DSL could be implemented either via Template Haskell or as a free monad. In any case it should be optional. It should be implemented as an extra layer on top of the current low-level API.