In tre piattaforme popolari con cui ho familiarità (.NET, java, python) le stringhe sono immutabili ma le liste sono di default mutabili.
In tutte le lingue esiste un supporto funzionale (linq, stream, list comprehensions), quindi è facile trasformare / filtrare un elenco in un elenco diverso.
Le stringhe e gli elenchi sono abbastanza simili in quanto entrambi sono wrapper di un array e infatti è abbastanza comune in natura vedere le basi di codice in cui la maggior parte degli elenchi viene utilizzata in modo immutabile una volta che sono stati costruiti con, ad esempio, linq.
Comprendo che in tutte e tre le lingue il supporto funzionale non era presente nella versione 1.0 ma resta il fatto che in nessuno dei due linguaggi non esiste una semplice classe supportata di prima classe che offre la garanzia di immutabilità che la stringa fa. Ad esempio, in .NET esiste un pacchetto nuget per l'installazione di questa funzionalità che mi sembra almeno tanto utile quanto una stringa.
Non credo che la maggior parte dei programmatori si sognerebbe di creare una sottostringa di una stringa usando qualcosa di diverso dal metodo di sottostringa incorporato. Qual è la ragione per cui siamo ancora inadempienti alle collezioni mutabili quando sono disponibili le apis funzionali che possono facilmente costruire collezioni immutabili?