| > higher rank 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. |
In practise, Haskell needs only few kind-annotations to make kind inference possible. This is helped by unannotated kind variables having kind * in Haskell (IIRC).