Il pattern che descrivi somiglia molto a un costruttore nella programmazione orientata agli oggetti; mentre i campi non sono necessariamente immutabili, è pratica comune costruire i propri oggetti come immutabili tranne che per i costruttori, ad esempio in un ipotetico linguaggio OOP:
class NumberSequenceString {
private string val;
public function __construct(top) {
val = "";
for (i = 1; i <= top; i++)
val = val + (string)i;
val = val + "z";
}
public getVal() { return val; }
}
var myString = new NumberSequenceString(10);
(Mi sono preso la libertà di rendere il tuo codice un po 'più interessante: invece di ripetere "z" 10 volte, ora sputa la stringa "12345678910z"
, il codice richiesto per costruire questa stringa è abbastanza complesso da dimostrare elaborazione non banale in seguito).
Tuttavia, la maggior parte degli idiomi di programmazione funzionale prende una strada diversa; invece di distinguere tra le fasi "non inizializzate", "costruttive" e "immutabili" del ciclo di vita di una variabile, eliminano solo le prime due: il ciclo di vita di una variabile inizia quando viene definito e la definizione fornisce già l'unico valore che sarà tutti hanno. Questo è possibile perché l'idioma di programmazione funzionale favorisce potenti espressioni su istruzioni , il che significa che il valore che si assegna può essere costruito in una sola espressione; invece di utilizzare loop iterativi con una variabile variabile mutabile, i programmatori funzionali pensano in termini di map
e reduce
. Il tuo esempio in stile funzionale sarebbe simile a questo:
function makeSequenceString(top) {
return range(1, top).map(toString).reduce(+) + "z";
}
const myString = makeSequenceString(10);
O, più idiomaticamente, in una sorta di sintassi pseudo-Haskell / ML / F #:
makeSequenceString top = (reduce (+) (map toString [1..top])) + "z"
myString = makeSequenceString 10
Si noti che la parte che costruisce il valore è solo una grande espressione e la funzione makeSequenceString
non fa assolutamente nulla ma valuta l'espressione e restituisce il suo valore. E poiché assegniamo questo valore immediatamente come parte della definizione di myString
, non c'è alcun punto nel programma in cui myString
non è inizializzato o "in costruzione" - non appena esiste, ha un valore, e questo è l'unico valore che avrà (almeno fino a quando il programmatore si attacca con uno stile puramente funzionale).