Determina automaticamente che alcune funzioni siano pure

2

Ho visto questa domanda che mostra che è impossibile da programmare determinare se una funzione javascript è pura, ma a volte è possibile affermare che una funzione è pura, quindi qualcosa come ...

function sq_a(x){ return x * x; }; // no side effects, all variables local
function sq_b(x){ return pow(x, 2); }; // if 'pow' is pure, this function is pure
function sq_c(x){ return mathlib.pow(x, 2); }; // not pure, because mathlib.pow could be changed

function definitelyPure(fn){
    if(/* criteria to check if we can know for sure fn is pure */){
        return true;
    } else {
        return false;
    }
}

function isPure(fn){
    if(/* fn is pure */){
        return 0;
    } else if(/* fn might be pure */) {
        return -1;
    } else { // fn is not pure
        return 1;
    }
}

definitelyPure(sq_a); // true
definitelyPure(sq_b); // false
definitelyPure(sq_c); // false

isPure(sq_a); // 0
isPure(sq_b); // -1
isPure(sq_c); // 1

Chiarimento:

So che non è possibile determinare se la funzione javascript qualsiasi sia pura come risposta in relazione alla domanda, ma sto chiedendo se è possibile affermare in modo programmatico la purezza delle funzioni alcune , come in: mi aspetto che sia possibile ad esempio sq_a utilizzare alcune analisi del codice, ma capisco che non sia possibile per sq_b .

Sono interessato a sapere se ci sono strumenti là fuori per fare questo già, e quali criteri determinano se è possibile dichiarare programmaticamente una funzione come pura, sconosciuta o impura.

    
posta Billy Moon 10.06.2016 - 00:55
fonte

1 risposta

2

È possibile, in generale, analizzare l'albero di analisi di una funzione e controllare una serie di vincoli che ci assicurano di sapere se la funzione è assolutamente pura:

  • Se la funzione chiama solo altre funzioni che sono pure
  • E non fa riferimento o modifica alcuna variabile globale

Allora è puro.

Tuttavia, c'è un problema nel fare ciò in Javascript (e in molti altri linguaggi dinamici), che forniscono un ambiente mutevole. Tu affermi che la tua funzione sq_b è pura, ma non puoi realmente dimostrarlo a meno che tu non sia in grado di determinare il comportamento di tutti gli altri codici che possono essere eseguiti prima, perché quel codice può fare qualcosa del genere :

window.nextPowResult = 1;
window.pow = function (a,b) { return nextPowResult ++; }

Cambia il comportamento della tua funzione (e qualsiasi altra funzione che usa pow ) e la rende non pura. Sfortunatamente, determinare se una cosa del genere possa accadere o meno è una domanda indecidibile, quindi in Javascript in particolare non possiamo mai essere certi che qualsiasi funzione sia pura, a meno che non abbiamo il controllo su tutto il codice che viene eseguito nello stesso contesto.

    
risposta data 10.06.2016 - 01:17
fonte

Leggi altre domande sui tag