story
A language designer can provide let polymorphism, refuse to add more, and call it a day.
> (higher) order/kinded types,
This is orthogonal to parametric polymorphism. Higher-kinded types are problematic for inference, and the way Haskell has implemented them has unfortunate consequences for modularity.
> where clauses,
This is just syntactic sugar. (FWIW, what I think Rust needs is better inference, rather than ways to make type signatures less verbose.)
> dependent types,
This is unrelated to parametric polymorphism.
> specialization
This is antithetical to parametric polymorphism.
> or else you force people to use dynamic checks/allocations/casts that reduce your type-safety and bog the code down relative to the "optimal" design.
Standard ML doesn't have dynamic checks or unsafe casts, and I don't find myself longing for them.