¿Hay algunas razones teóricas para eso (como que la verificación de tipos o la inferencia de tipos se volverían indecidibles), o razones prácticas (demasiado difíciles de implementar adecuadamente)?
Actualmente, podemos envolver cosas newtype
como
newtype Pair a = Pair (a, a)
y luego tener Pair :: * -> *
pero no podemos hacer algo como eso λ(a:*). (a,a)
.
(Hay algunos idiomas que los tienen, por ejemplo, Scala sí ).