No. Puoi facilmente verificare se una funzione esegue solo operazioni "pure-safe", come descritto nella risposta di Jon Purdy, ma che non è IMO sufficiente per rispondere alla domanda.
Considera questa funzione:
function possiblyPure(x) {
if (someCheck(x)) {
return x+1; // pure code path
}
else {
console.log("I'm so unpure..."); // unpure code path
}
}
Ovviamente, se someCheck
non è sicuro, così è possiblyPure
. Ma, se someCheck
è puro e restituisce true
per ogni possibile valore di x
, possiblyPure
è puro, poiché il percorso del codice non protetto è irraggiungibile!
E qui arriva la parte difficile: determinare se someCheck
restituisce true per ogni input possibile. Cercare di rispondere a questa domanda ti porta immeditamente nel regno del problema e di simili problemi indecidibili.
EDIT: Prova che è impossibile
C'è qualche incertezza se o no una funzione pura deve terminare su ogni input possibile. Ma in entrambi i casi, il problema dell'arresto può essere usato per mostrare che il controllo della purezza è impossibile.
Caso A) Se per terminare su ogni input possibile è necessaria una pura funzione, avere per risolvere il problema di interruzione per determinare se la funzione è pura o meno. Poiché questo è noto per essere impossibile, con questa definizione, la purezza non può essere calcolata.
Caso B) Se una funzione pura è autorizzata a non terminare su alcuni input, possiamo costruire qualcosa del genere:
Supponiamo che isPure(f)
calcoli se f
è una stringa che definisce una funzione pura.
function halts(f) {
var fescaped = f.replace(/\"/g, '\"');
var upf = 'function() { '+f+'("'+fescaped+'\); console.log("unpure"); }';
return isPure(upf);
}
Ora isPure
deve determinare se f
si arresta o meno sulla propria fonte come input. Se si ferma, upf
non è sicuro; se non termina, upf
è puro iff f
è puro.
Se isPure
ha funzionato come previsto (restituisce risultati corretti e termina su ogni input), avremmo risolto il problema di interruzione (*)! Poiché questo è noto per essere impossibile, isPure
non può esistere.
(*) per le funzioni JavaScript pure, che è sufficiente per risolverlo anche per il turing machine.