Краткий ответ таков: если алгоритм не имеет эффектов, которые можно наблюдать после его завершения (кроме того, что он возвращает), он является чистым.Это справедливо даже в тех случаях, когда вы выполняете такие вещи, как деструктивное обновление массива или мутация.
Если у вас был такой алгоритм, как, скажем:
function zero(array):
ix <- 0
while(ix < length(array)):
array[ix] <- 0
ix <- ix+1
return array
Предполагая, что наш псевдокод выше имеет лексическую область действия, пока массивПараметр сначала копируется, а возвращаемый массив - совершенно новая вещь, этот алгоритм представляет собой чистую функцию (в этом случае, функция Haskell fmap (const 0)
, вероятно, будет работать).Большинство «императивных» алгоритмов, показанных в книгах, представляют собой действительно чистые функции, и совершенно нормально написать их таким образом в чисто функциональной обстановке, используя что-то вроде ST.
Я бы рекомендовал взглянуть на Mercury или Disciple Disciplined Compilerчтобы увидеть чистые языки, которые все еще процветают на разрушении.