Parece que, ao ler algo como este artigo da Wikipedia sobre "funções puras" , elas são listadas Today()
como um exemplo de função impura, mas me parece bastante pura. É porque não há argumento formal de entrada? Por que a hora do dia real não é tratada como a "entrada para a função"; nesse caso, se você forneceu a mesma entrada, ou seja, executou today()
duas vezes ao mesmo tempo ou viajou de volta no tempo para executá-la novamente (talvez uma hipótese: )), a saída seria ao mesmo tempo. Today()
nunca fornece um número aleatório. sempre fornece a hora do dia.
O artigo da Wikipedia diz que "em épocas diferentes ela produzirá resultados diferentes", mas é como dizer que para diferentes x
sin(x)
fornecerá proporções diferentes. E sin(x)
é o exemplo deles de uma função pura.
fonte
Respostas:
Isso ocorre porque a saída depende de algo que não é uma entrada, a saber, a hora atual.
Porque você não passou como parâmetro. Se você o passasse como parâmetro, a função se tornaria uma função de identidade em datas, o que é bastante inútil. O objetivo de uma
Today()
função é produzir algo que depende de um valor externo e que muda constantemente (tempo).A vantagem de funções puras é que seu comportamento é absolutamente reprodutível e determinístico, facilitando a obtenção de provas formais e garantias concretas. Eles sempre fazem a mesma coisa.
Today()
é praticamente o oposto: sempre (permitindo granularidade de tempo) faz algo diferente.fonte
Today()
)Today()
torna-se impuro. AToday()
função pode ser um exemplo meio bobo. Mais apropriado pode ser algumaCount()
função. Dado o mesmo número de itens a serem contadosCount()
, sempre retornará o mesmo número, mas, como está fora do escopoCount()
, é impuro.count()
na maioria das linguagens de programação é definitivamente puro. Ele tem um valor de entrada explícito: a coleção cuja contagem você deseja. Não se confunda com uma sintaxe comomyCollection.count()
; isso é apenas açúcarcount(myCollection)
.sin(x)
sempre retornará o mesmo valor, desde quex
permaneça o mesmo.Today()
pode retornar resultados diferentes ao longo do tempo, pois depende de valores fora do seu controle . Por exemplo, se algo fora do controle do seu programa alterar o interno do sistema$current_datetime
enquanto o programa estiver em execução,Today()
produzirá resultados diferentes repentinamente.fonte
Today()
retornaria "quinta-feira" na segunda-feira.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ê podeAdd(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.
fonte
Parece bastante óbvio que essa função falha no primeiro teste de pureza dado no início dessa página:
Observe que, como não requer argumentos, há apenas um conjunto possível de valores de argumentos - o conjunto vazio. E essa função pode e retorna resultados diferentes para o mesmo 'valor (es) de argumento'.
Além disso, o valor do resultado função não depender de "escondidas ... estado que pode mudar à medida que a execução do programa prossegue". Então, outro fracasso.
fonte
() => 1
seria uma função pura, pois sempre retorna 1.Today()
pode retornar "segunda-feira" ou "terça-feira" ou quase qualquer outro valor.Outra maneira de pensar é que funções puras não dependem do estado. O mundo é tipicamente considerado estado. Você precisa conhecer o estado da realidade para saber que dia é hoje.
No entanto, você não precisa saber nada de especial sobre o estado do mundo para saber o que
sin(x)
é. E sempre chamarsin(x)
para um dadox
retornará o mesmo valor.fonte
Date(timestamp)
seria uma função pura. Por causa de sua idempotência. E porque não haveria efeito colateral.Today()
pode variar o resultado dependendo de quando você o chama. É isso que a torna impura. Não é idempotente. Porém, não tem efeito colateral, mas isso não a torna pura.fonte
Aqui está um pequeno pseudo-código que penso ao discutir funções puras
Se isso for executado indefinidamente e nunca puder desencadear a afirmação, é uma função pura. Mais ainda, se você tiver uma função que usa args, faça uma pequena modificação ....
Se você pode usá-lo após todas as atribuições de variáveis no seu aplicativo, e isso não altera os resultados, e nunca pode falhar na afirmação, é uma função pura.
fonte
Primeiro, não existe uma função sem argumento (ou uma matriz sem índices ou um mapa sem chaves). É a característica definidora de uma função mapear um ou mais valores de argumento para outro valor.
Portanto,
today
ou não é uma função, portanto nenhuma função pura. Ou podemos interpretar a sintaxeum pouco para que isso signifique
Em Haskell, por exemplo, isso seria válido:
porque existe um tipo () com um único valor ().
A questão é apenas: como
today
calcular o dia da semana, se ele tiver apenas ()? Isso simplesmente não é possível sem a leitura do timer do sistema, diretamente ou através das funções impuras auxiliares.O timer do sistema é um excelente exemplo para o estado global.
fonte
O problema
today()
é que ele pode produzir um resultado diferente se chamado duas ou mais vezes em uma função.Aqui está um exemplo de código que pode introduzir um erro.
É possível no exemplo acima. Que a segunda
if
declaração não será executada. Mesmo se o primeiro fez. Deixando um recurso em um estado ruim.fonte
Para ser uma função pura, fornecer os mesmos parâmetros deve fornecer o mesmo resultado sempre.
Cada vez que ligamos
Today()
, estamos fornecendo os mesmos parâmetros (nenhum) e, no entanto, não obtendo necessariamente o mesmo resultado (segunda, terça, etc.).fonte