[Haskell-cafe] Expressing "self-composable" functions at the type level