withoutboats makes an interesting comment here:
Higher kinded polymorphism results in trivially undecidable type inferences without something like currying; the restrictions needed to support it would be arbitrary and weird given that Rust does not have currying (essentially some rules to reconstruct the restrictions of currying in type operator context).
I'm not a Haskell expert but I've dabbled enough to know what currying is, and I have rough familiarity with HKTs from C++ (which has both GATs and template template parameters). Still, I'm surprised to learn these things are somehow intertwined. How does currying help? How is currying a "restriction"? It just seems like a terser way to write a lambda function wrapper that has already locked in one argument to the underlying function, e.g. double = multiply 2
.