Today () é uma função impura porque seu resultado depende de algo que você não fornece; especificamente, a hora atual do sistema. Portanto, seu resultado não é determinístico quando baseado apenas nas entradas fornecidas na chamada.
Uma função pura seria int Add(int a, int b) {return a + b;}
. A função funciona apenas com o que é fornecido e não usa outros dados de estado externos. O resultado natural disso é que você pode Add(2,2)
obter 4 a partir de agora até o final dos tempos. Além disso, como a função não altera nenhum estado externo (não possui "efeitos colaterais"), os Add () 2 e 2 a partir de agora até o final dos tempos não mudarão mais nada no sistema, a menos que você atribua o resultado da função a uma variável ou use o valor para atualizar o estado (que não é uma operação executada pela própria função). Praticamente todas as operações matemáticas clássicas são funções puras e podem ser implementadas como tal.
Hoje (), por outro lado, pode produzir o mesmo valor quando chamado duas vezes seguidas, mas não se for chamado repetidamente por vários dias. Isso ocorre porque depende de dados de estado externo que não são fornecidos por você como parâmetro para a função. Como resultado, é impossível, dentro dos limites do programa, controlar o resultado da função Today (). Ele produzirá um determinado valor em um determinado dia e nunca produzirá esse valor em outro dia, a menos que você altere o relógio do sistema do computador em que é executado (uma alteração geralmente ocorrendo fora dos limites do programa).
Uma função impura não é necessariamente uma coisa ruim; funções impuras são necessárias, mesmo em linguagens funcionais, para interagir com qualquer coisa fora dos limites do programa, como armazenamentos de dados, pipelines de comunicação, monitores da interface do usuário, dispositivos periféricos etc. Um programa que não faz nada disso é um programa isso é fortemente limitado em sua utilidade; Eu chegaria ao ponto de chamar esse programa de trivial, pois, sem meios para aceitar entradas ou meios para informá-lo sobre sua saída, ele poderia estar fazendo nada. Os programas escritos em linguagens funcionais podem ter apenas a entrada fornecida pelo tempo de execução e produzir uma saída relatada ao tempo de execução sem métodos impuros explicitamente definidos, mas isso ocorre porque o tempo de execução está abstraindo todos esses detalhes impuros do trabalho em um sistema de computador imperfeito,
É simplesmente uma coisa muito boa saber quais das funções que você está usando são puras e quais não, para que você possa tomar boas decisões sobre como elas são usadas. Funções impuras, porque fazem coisas ou são dependentes de coisas que não são aparentes em seu uso, podem se comportar de forma imprevisível, dado apenas o conhecimento do uso. É necessário um conhecimento adicional do objetivo da função e, portanto, do que ela precisa ou faz para o estado externo, a fim de colocar um sistema que a use em um estado consistente e, assim, esperar um resultado determinístico.