support higher kinded types

probably requires C++ lambda's or a custom curried function implementation