{-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE RankNTypes #-} module Text.PrintfA where import Text.Printf data PrintfArgT = forall a. PrintfArg a => P a data PrintfTypeT = T { PrintfTypeT -> forall r. PrintfType r => r unT :: forall r. PrintfType r => r } printfa :: PrintfType t => String -> [ PrintfArgT ] -> t printfa :: forall t. PrintfType t => String -> [PrintfArgT] -> t printfa String format = (\(T forall r. PrintfType r => r t) -> forall r. PrintfType r => r t) forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl (\(T forall r. PrintfType r => r r) (P a a) -> (forall r. PrintfType r => r) -> PrintfTypeT T forall a b. (a -> b) -> a -> b $ forall r. PrintfType r => r r a a ) ((forall r. PrintfType r => r) -> PrintfTypeT T forall a b. (a -> b) -> a -> b $ forall r. PrintfType r => String -> r printf String format)