Нет. Вы можете легко проверить, выполняет ли функция только «чисто безопасные» операции, как описано в ответе Джона Пурди, но этого ИМО недостаточно для ответа на вопрос.
Рассмотрим эту функцию:
function possiblyPure(x) {
if (someCheck(x)) {
return x+1; // pure code path
}
else {
console.log("I'm so unpure..."); // unpure code path
}
}
Очевидно, что если не someCheck
является чистым, так и есть possiblyPure
. Но, если someCheck
он чистый и возвращает true
все возможные значения x
, он possiblyPure
является чистым, поскольку путь к неочищенному коду недоступен!
И тут возникает сложная часть: определить, someCheck
возвращает ли значение true для каждого возможного ввода. Попытка ответить на этот вопрос незамедлительно приводит вас в сферу проблемы остановки и подобных неразрешимых проблем.
РЕДАКТИРОВАТЬ: Доказательство того, что это невозможно
Существует некоторая неопределенность, или нет чистая функция должна завершаться на каждом возможном входе. Но в обоих случаях проблему остановки можно использовать, чтобы показать, что проверка чистоты невозможна.
Случай A) Если для завершения каждого возможного входа требуется чистая функция, вам необходимо решить проблему остановки, чтобы определить, является ли функция чистой. Поскольку известно, что это невозможно, по этому определению чистота не может быть вычислена.
Случай B) Если чистой функции разрешено не заканчиваться на некоторых входах, мы можем сконструировать что-то вроде этого: предположим, что isPure(f)
вычисляет if f
- это строка, определяющая чистую функцию.
function halts(f) {
var fescaped = f.replace(/\"/g, '\\"');
var upf = 'function() { '+f+'("'+fescaped+'\); console.log("unpure"); }';
return isPure(upf);
}
Теперь isPure
нужно определить, f
останавливается ли его собственный источник в качестве входных данных. Если оно останавливается, upf
это нечисто; если оно не заканчивается, upf
оно чисто, если f
оно чисто.
Если бы мы isPure
работали, как ожидалось (возвращает правильные результаты и завершаются при каждом вводе), мы бы решили проблему остановки (*)! Поскольку известно, что это невозможно, isPure
не может существовать.
(*) для функций на чистом JavaScript, что достаточно для его решения и для машины Тьюринга.
if (rand(1000000)<2) return WRONG_ANSWER
, многократное исследование функции на предмет согласованного поведения не поможет. Но если у вас есть доступ к определению функции, доказательство тривиально.say
вызовы .console.log
say