StackOverflow me apontou aqui, então a pergunta pode ser um pouco nos termos de um leigo.
A Wikipedia define funções puras como
Na programação de computadores, uma função pode ser descrita como uma função pura se ambas as instruções sobre a função se mantiverem:
- A função sempre avalia o mesmo valor de resultado, dados os mesmos valores de argumento. O valor do resultado da função não pode depender de nenhuma informação ou estado oculto que possa mudar à medida que a execução do programa prossegue ou entre diferentes execuções do programa, nem pode depender de qualquer entrada externa de dispositivos de E / S.
- A avaliação do resultado não causa nenhum efeito colateral ou saída semanticamente observável, como mutação de objetos mutáveis ou saída para dispositivos de E / S.
No entanto, parece não citar nenhuma fonte - portanto, é difícil dizer se essa é uma definição aceita ou quem a definiu dessa maneira.
Quando observo o que os idiomas fazem quando incluem uma sintaxe / anotação para funções "puras", existem algumas abordagens diferentes:
- Em D, a única limitação é a não mutação do estado global. Funções "puras" podem alterar seus argumentos.
- No GCC, existem dois tipos de "puro":
pure
(sem efeitos colaterais, mas pode ler o estado global) econst
(estritamente puro conforme a definição da Wikipedia). - No C # , é definido como "não faz alterações visíveis no estado" (seja o que for).
- Haskell segue a definição da Wikipedia.
Então, minha pergunta é: existe uma definição canônica de função pura?
E se houver, qual é a sua fonte?