Hoje () é uma função impura porque seu resultado depende de algo que você não dá; especificamente, a hora atual do sistema. Portanto, seu resultado não é determinístico quando baseado apenas nas entradas fornecidas na invocação.
Uma função pura seria int Add(int a, int b) {return a + b;}
. A função trabalha somente com o que é dado e não usa nenhum outro dado de estado externo. O resultado natural disso é que você pode Add(2,2)
e obter 4 a partir de agora até o final do tempo. Além disso, como a função não altera nenhum estado externo (não tem "efeitos colaterais"), Add () 2 e 2 a partir de agora até o final do tempo não alterará 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 externos que não são fornecidos por você como um 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 no qual ele é executado (uma alteração geralmente ocorrendo fora dos limites do programa). / p>
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, exibições de interface do usuário, dispositivos periféricos etc. Um programa que não faz nada disso é um programa isto é agudamente limitado em sua utilidade; Eu chegaria a ponto de chamar esse programa de trivialidade, pois, sem meios para aceitar contribuições ou qualquer meio de informá-lo de sua produção, poderia muito bem não estar fazendo nada. Programas escritos em linguagens funcionais podem ter apenas a entrada fornecida pelo tempo de execução e produzir uma saída reportada ao tempo de execução sem qualquer método impuro explicitamente definido, mas isso porque o tempo de execução está abstraindo todos esses detalhes impuros de trabalhar dentro de um sistema de computador imperfeito. que o próprio programa pode ser estruturado em termos de um conjunto aninhado de expressões matemáticas que o tempo de execução avalia, então, a entrada inicial dada.
É simplesmente uma Coisa Muito Boa saber quais das funções que você está usando são puras e quais não sã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. Mais conhecimento do propósito da função e, portanto, do que ela precisa ou não do estado externo, é necessário para colocar um sistema que a utiliza em um estado consistente e, assim, esperar um resultado determinístico.