{-# LANGUAGE GADTs, KindSignatures #-}
data TAList :: (* -> * -> *) -> * -> * -> * where
Nil :: TAList c x x
(:::) :: c x y -> TAList c y z -> TAList c x z
infixr 5 :::
newtype Func a b = Func { unFunc :: a -> b }
foldTAList :: a -> TAList Func a b -> b
foldTAList acc Nil = acc
foldTAList acc (h ::: t) = foldTAList (unFunc h acc) t
half x = fromIntegral x / 2 :: Rational
oneThird x = fromRational x / 3 :: Double
flow :: TAList Func Int String
flow = Func half ::: Func oneThird ::: Func show ::: Nil
main = print $ foldTAList 12 flow