support higher kinded types
probably requires C++ lambda's or a custom curried function implementation