Ответ 1
Теоретически точка pure
в D состоит в том, что она должна гарантировать, что функция является побочным эффектом независимо от того, как эта функция реализована. В D есть два вида чистоты:
-
Все функции, отмеченные
pure
, слабо чисты. Они могут не иметь доступа к глобальному изменяемому состоянию (глобальные переменные, переменные потока, переменныеstatic
и т.д.) Или выполнять ввод-вывод. Однако они могут изменить свои аргументы. Точка этих функций состоит в том, что они могут быть вызваны из сильно чистых функций (подробно ниже), не нарушая гарантий сильной чистоты. -
Все функции, которые являются слабо чистыми и, не имеют аргументов с изменяемой косвенностью, являются сильно чистыми. Для этого можно использовать конструкторы типа
const
иimmutable
. (При работе с структурами и классами указательthis
считается параметром.) Сильно чистые функции обладают всеми хорошими свойствами, о которых говорят функциональные программисты, даже если они реализованы с использованием изменяемого состояния. Сильно чистая функция всегда возвращает одно и то же значение для любых заданных аргументов и не имеет наблюдаемых побочных эффектов. Сильно чистые функции являются ссылочно прозрачными, то есть их возвращаемое значение может быть заменено вызовом к ним с заданным набором параметров, не влияя на наблюдаемое поведение. Любая сильно чистая функция может быть безопасно выполнена параллельно с любой другой сильно чистой функцией.
К сожалению, взаимодействие между общим кодом и pure
(а также const
и immutable
) довольно невелико. Было высказано несколько предложений по исправлению этого вопроса, но пока никто не был принят.
\ std.algorithm записывается как можно более общий, поэтому он не может требовать, чтобы его лямбда-функции и диапазоны, которые он принимает, были чистыми. Кроме того, функции системы типов, которые были добавлены в D2, как правило, являются самыми ошибками в языке, потому что более основные вещи были приоритетными перед устранением соответствующих проблем. Прямо сейчас pure
в основном не используется, за исключением тривиальных случаев, таких как std.math.