Assume I have encoded the natural numbers in Haskell types, and that I have a way of adding and subtracting from them:
data Zero
data Succ n
-- ...
I see your functional-dependency multiparameter empty-datatype flexibly scoped type variables and raise you a Haskell 98 version! It uses HoleyMonoid which is available on hackage:
{-# LANGUAGE NoMonomorphismRestriction #-}
import Prelude hiding (id, (.))
import Control.Category
import Data.HoleyMonoid
suc n = later (:[]) . n
zero = id
one = suc zero
two = suc one
three = suc two
buildList = run
Testing (feel free to omit any type signatures):
> run three "one" "two" "three"
["one","two","three"]