Today () - это нечистая функция, потому что ее результат зависит от того, чего вы не даете; в частности, текущее системное время. Следовательно, его результат не является детерминированным, если он основан только на входных данных, предоставленных при вызове.
Чистая функция была бы int Add(int a, int b) {return a + b;}
. Функция работает исключительно с тем, что ей дано, и не использует никаких других данных внешнего состояния. Естественным результатом этого является то, что вы можете Add(2,2)
и получить 4 с этого момента до конца времени. Кроме того, поскольку функция не изменяет никакое внешнее состояние (у нее нет «побочных эффектов»), Add () ing 2 и 2 с этого момента до конца времени не изменит ничего в системе, если только вы не присвойте результат функции переменной или иным образом используйте значение для обновления состояния (которое не является операцией, выполняемой самой функцией). Практически все классические математические операции являются чистыми функциями и могут быть реализованы как таковые.
Today (), с другой стороны, может выдавать одно и то же значение при вызове два раза подряд, но не при повторном вызове в течение нескольких дней. Это связано с тем, что он зависит от данных внешнего состояния, которые вы не предоставили в качестве параметра функции. В результате невозможно в рамках программы контролировать результат функции Today (). Он выдаст заданное значение в определенный день и никогда не выдаст это значение в любой другой день, если только вы не измените системные часы компьютера, на котором он запущен (изменение, как правило, происходит за пределами программы).
Нечистая функция не обязательно плохая вещь; нечистые функции требуются, даже на функциональных языках, для взаимодействия с чем-либо, находящимся за пределами программы, например с хранилищами данных, коммуникационными конвейерами, дисплеями пользовательского интерфейса, периферийными устройствами и т. д. Программа, которая не выполняет ничего из этого, является программой. это резко ограничено в его полезности; Я бы даже зашел так далеко, что назвал такую программу тривиальной, так как без каких-либо средств, чтобы принять ввод или какой-либо способ сообщить вам о ее результатах, она могла бы также ничего не делать. Программы, написанные на функциональных языках, могут иметь только входные данные, предоставленные средой выполнения, и создавать выходные данные, сообщаемые среде выполнения, без каких-либо явно определенных нечистых методов, но это потому, что среда выполнения абстрагирует все эти нечистые детали работы в несовершенной компьютерной системе,
Просто очень хорошо знать, какие из функций, которые вы используете, являются чистыми, а какие нет, чтобы вы могли принимать правильные решения о том, как они используются. Нечистые функции, потому что они делают вещи или зависят от вещей, которые не очевидны из их использования, могут вести себя непредсказуемо, учитывая только знание об использовании. Требуются дополнительные знания о назначении функции и, следовательно, о том, что ей нужно от или делает для внешнего состояния, чтобы привести систему, которая использует ее, в согласованное состояние и, таким образом, ожидать детерминированного результата.