What does the "stateless functional view of algorithms" mean?
Possiamo pensare ad un algoritmo in astratto come descrizione di un meccanismo che prende determinati input e produce determinati output indipendenti dallo stato del mondo . Se hai un meccanismo chiamato "somma" che prende in 2 e 3 e produce 5, produce sempre 5 quando viene dato 2 e 3, non importa quale sia la fase della luna o chi sia il re di Francia oggi. Non esiste uno "stato" che l'algoritmo debba consultare oltre ai valori forniti come argomenti.
La distinzione che l'autore sta disegnando è che anche in algoritmi che sono "puri" a questo riguardo, è spesso conveniente fare qualche pre-elaborazione, archiviarlo come stato e quindi usare quello stato durante l'operazione di un algoritmo . Anche se risultato è un algoritmo che sembra non dipendere dallo stato del mondo, internamente sta consumando o modificando il proprio universo di stato privato.
I think that the standard view of algorithms are based on states, correct?
La visualizzazione standard degli algoritmi in OO o nei linguaggi procedurali è una sequenza di mutazioni da dichiarare, sì. Ma questa non è la vista standard funzionale . La vista funzionale è che gli algoritmi hanno output che dipendono dagli input e non esiste uno stato mutabile.
È sempre possibile scrivere un algoritmo stateful come algoritmo stateless; basta rendere lo stato uno degli input dell'algoritmo e fare in modo che gli output includano una copia dei "cambiamenti" nello stato; nulla è realmente mutato. Ma è spesso scomodo, inelegante o non performante farlo in pratica.
Naturalmente anche il contrario è vero; molti algoritmi scritti come una sequenza di mutazioni sono vulnerabili a bug sgradevoli in cui le mutazioni vengono eseguite in modo incoerente o fuori uso. Ripensando a un algoritmo come una produzione di valori da input senza mutazioni, puoi ottenere spesso risultati di prestazioni significativi (grazie a persistenza, memoizzazione e così via) e rimuovere fonti di bug.