"Нормальный" способ выразить, что такое чистая функция , в терминах ссылочная прозрачность .Функция pure , если она ссылочно-прозрачная .
Ссылочная прозрачность , грубо говоря, означает, что вы можете заменить вызов функции наего возвращаемое значение или наоборот в любой точке программы, не меняя смысла программы.
Так, например, если C printf
были ссылочно прозрачными, эти две программы должны иметь одинаковое значение:
printf("Hello");
и
5;
и все следующие программы должны иметь одинаковое значение:
5 + 5;
printf("Hello") + 5;
printf("Hello") + printf("Hello");
Поскольку printf
возвращает количество написанных символов, в данном случае 5.
Это становится еще более очевидным с void
функциями.Если у меня есть функция void foo
, то
foo(bar, baz, quux);
должно быть таким же, как
;
Т.е. поскольку foo
ничего не возвращает, я должен иметь возможность заменить его ничембез изменения смысла программы.
Понятно, что ни printf
, ни foo
не являются ссылочно прозрачными, и поэтому ни один из них не является чистым.На самом деле, функция void
никогда не может быть прозрачной по ссылкам, если только она не запрещена.
Я считаю, что это определение гораздо проще обрабатывать, чем то, которое вы дали.Он также позволяет вам применять его с любой степенью детализации: вы можете применять его к отдельным выражениям, к функциям, ко всем программам.Это позволяет вам, например, говорить о такой функции:
func fib(n):
return memo[n] if memo.has_key?(n)
return 1 if n <= 1
return memo[n] = fib(n-1) + fib(n-2)
. Мы можем проанализировать выражения, составляющие функцию, и легко сделать вывод, что они не являются ссылочно прозрачными и, следовательно, не чистыми, поскольку онииспользуйте изменяемую структуру данных, а именно массив memo
.Однако мы также можем взглянуть на функцию и увидеть, что она является ссылочно прозрачной и, следовательно, чистой.Это иногда называют внешней чистотой , то есть функцией, которая кажется чистой для внешнего мира, но реализованной нечистым внутри.
Такие функции все еще полезны, потому что, хотя нечистота заражает все вокруг,внешний чистый интерфейс создает своего рода «барьер чистоты», когда примеси заражают только три строки функции, но не проникают в остальную часть программы.Эти три строки гораздо проще проанализировать на правильность, чем всю программу.