Warum ist es schwierig festzustellen, ob eine Funktion rein ist?

Ich war gestern auf der StackOverflow Dev Days Convention und einer der Redner sprach über Python. Er zeigte eine Memoize-Funktion, und ich fragte, ob es eine Möglichkeit gebe, die Verwendung für eine nicht reine Funktion zu verhindern. Er sagte nein, das ist im Grunde unmöglich, und wenn jemand einen Weg finden könnte, dies zu tun, wäre dies eine großartige Doktorarbeit.

Das hat mich verwirrt, weil es für einen Compiler / Interpreter nicht so schwierig zu sein scheint, rekursiv zu lösen. Im Pseudocode:

function isPure(functionMetadata): boolean;
begin
   result = true;
   for each variable in functionMetadata.variablesModified
      result = result and variable.isLocalToThisFunction;
   for each dependency in functionMetadata.functionsCalled
      result = result and isPure(dependency);
end;

Das ist die Grundidee. Natürlich müssten Sie eine Art Überprüfung durchführen, um eine unendliche Rekursion von voneinander abhängigen Funktionen zu verhindern, aber das ist nicht allzu schwierig einzurichten.

Funktionen höherer Ordnung, die Funktionszeiger verwenden, können problematisch sein, da sie nicht statisch verifiziert werden können. Meine ursprüngliche Frage setzt jedoch voraus, dass der Compiler eine Art von Sprachbeschränkung hat, die angibt, dass nur ein reiner Funktionszeiger an einen bestimmten Parameter übergeben werden kann . Wenn es eine gibt, kann diese verwendet werden, um die Bedingung zu erfüllen.

Offensichtlich wäre dies in einer kompilierten Sprache einfacher als in einer interpretierten Sprache, da all diese Zahlenkürzel vor der Ausführung des Programms durchgeführt würden und so nichts verlangsamen, aber ich sehe keine grundlegenden Probleme, die dies unmöglich machen würden zu bewerten.

Weiß jemand mit ein bisschen mehr Wissen in diesem Bereich, was ich vermisse?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage