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?
terminology
functional-programming
semantics
Andrey Shchekin
fonte
fonte
Respostas:
Como observado neste artigo Programação Funcional Imperativa (1993) de Peyton-Jones e Wadler (entre o grupo de pesquisadores que criou Haskell):
o foco está na ausência de efeitos colaterais para permitir transformações de programa (ou seja, otimizações do compilador).
Quais são os efeitos colaterais? Este artigo, por sua vez, aponta para Integração da programação funcional e imperativa (1986) de Gifford e Lucassen, que menciona quatro tipos de classes de efeito : Pura, Função, Observador e Procedimento. Portanto, o termo "função pura" deriva deste artigo.
Observe, no entanto, que Peyton-Jones e Wadler mencionaram deficiências nessa abordagem. É importante notar, dizem eles, a linguagem de programação Clean, que usa tipos lineares para introduzir efeitos colaterais de uma maneira segura (isto é, segura para o compilador). Basicamente, ele encadea o mundo como uma variável em todas as funções relacionadas à E / S, incluindo o principal ponto de entrada.
Com isso, é possível ter uma linguagem funcional pura interagindo com o mundo e tendo efeitos colaterais (E / S, sistema operacional, sistema de janelas, etc.), contradizendo parcialmente sua definição da Wikipedia. Pode-se dizer de fato que Haskell tem o Clean como um de seus influenciadores; embora se afaste de tipos lineares e use outra construção de nível de tipo (mônadas) para garantir linearidade, ou seja, uma referência única o tempo todo.
fonte
(f_handle, world2) = fopen file_name, world
(pseudocódigo) e uma próxima chamada precisará ser usadaworld2
. Em essência, os programas são vistos como operando no universo como um todo. Coloque outra maneira, não há efeitos colaterais quando você está operando no Universo :-)A definição da Wikipedia é canônica. Os dois requisitos cruciais são:
O valor de retorno e o comportamento da função são uma função determinística dos argumentos que foram explicitamente passados para a função.
Uma invocação da função não tem efeitos colaterais observáveis.
A rigor, D e gcc não devem usar a palavra "puro" da maneira que usam; é um abuso da terminologia padrão.
fonte