Ci sono alcune ragioni teoriche per questo (come il fatto che la verifica del tipo o l'inferenza del tipo diventerebbero indecidibili) o ragioni pratiche (troppo difficili da implementare correttamente)?
Attualmente, possiamo avvolgere le cose newtype
come
newtype Pair a = Pair (a, a)
e poi avere Pair :: * -> *
ma non possiamo fare qualcosa del genere λ(a:*). (a,a)
.
(Ci sono alcune lingue che le hanno, ad esempio Scala .)