Módulo 14 - Imutabilidade e efeitos: código previsível
Função pura a fundo: só entra e sai
8 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026
O que você vai aprender
- Definir função pura pelas duas exigências: depende só dos argumentos e não causa efeito externo.
- Explicar por que a mesma entrada sempre gera a mesma saída.
- Identificar o que torna uma função impura.
- Perceber por que funções puras são fáceis de testar.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Função pura a fundo: só entra e sai.
Os objetivos desta aula. Definir função pura pelas duas exigências: depende só dos argumentos e não causa efeito externo. Explicar por que a mesma entrada sempre gera a mesma saída. Identificar o que torna uma função impura. Perceber por que funções puras são fáceis de testar.
Veja o essencial, parte por parte.
As duas regras da pureza. Função pura depende só dos argumentos: nada de ler variável global ou relógio.
O que torna uma função impura. Uma função vira impura no instante em que quebra uma das duas regras.
Por que a função pura é fácil de testar. Deixe o cálculo, a decisão e a transformação de dados em funções puras.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
As duas regras da pureza
A pureza cabe em duas regras. A primeira: o resultado depende apenas do que entra pelos argumentos. A função não espia uma variável global que pode ter mudado, não lê o relógio do sistema, não sorteia um número aleatório por dentro. Tudo de que ela precisa chega pela porta da frente. A segunda regra: a função não causa efeito nenhum no mundo externo. Ela não grava um arquivo, não escreve na tela, não manda uma mensagem pela rede, não altera um dado compartilhado. O único vestígio que deixa é o valor que devolve. Juntando as duas, você tem uma peça que se comporta como uma fórmula da matemática: entra x, sai f de x, sempre igual.
Essa combinação dá um superpoder chamado transparência referencial. Se uma função é pura, você pode substituir a chamada dela pelo resultado que ela devolveria, e o programa não muda em nada. Escrever somar(2, 3) ou escrever 5 direto dá no mesmo, porque a chamada não faz mais nada além de produzir o cinco. Isso libera o computador para guardar resultados e reaproveitar, e libera você para raciocinar sobre o código como quem lê contas no papel. Cada peça pura é uma verdade estável, que vale hoje, amanhã e daqui a mil chamadas.
O que torna uma função impura
Uma função vira impura no instante em que quebra uma das duas regras. Ler o relógio a torna impura, porque a saída passa a depender de quando você chamou, não só dos argumentos. Ler ou escrever uma variável global a torna impura, porque agora ela depende de algo que está fora dos argumentos, ou mexe em algo que outros veem. Imprimir na tela, salvar um arquivo, mandar um e-mail, tudo isso é efeito externo e derruba a pureza. Repare no exemplo abaixo: a mesma ideia, calcular um preço com desconto, aparece pura e impura. A pura recebe a taxa por argumento; a impura vai buscar a taxa numa variável de fora, que pode ter mudado, e ainda registra a operação num log.
// PURA: tudo vem dos argumentos, nada vaza para fora
função precoFinal(preco, taxaDesconto)
retorne preco - preco * taxaDesconto
fim
// IMPURA: lê variável global e escreve no mundo externo
taxaGlobal <- 0.1
função precoImpuro(preco)
escreva("calculando...") // efeito externo
retorne preco - preco * taxaGlobal // depende de fora dos argumentos
fimA versão pura só depende de preco e taxaDesconto. A impura lê taxaGlobal e imprime, dois pecados.
🎮 Jogo da aula
É pura ou não?
Julgue cada afirmação sobre funções puras. Uma função pura depende só dos argumentos e não causa efeito externo.
Por que a função pura é fácil de testar
Testar uma função pura é quase trivial, e é aqui que o esforço da pureza se paga. Como ela só depende dos argumentos, o teste é uma linha: chame com uma entrada conhecida e confira se a saída é a esperada. Não precisa preparar um banco de dados, simular a rede, congelar o relógio nem limpar arquivos depois. Não há estado escondido para arrumar antes nem sujeira para varrer depois. Já uma função impura obriga o teste a montar todo o cenário externo, e ainda assim pode falhar de forma diferente a cada execução, porque depende de coisas que mudam. Quanto mais lógica você concentra em funções puras, mais barato e confiável fica testar o programa inteiro.
Teste rápido
Quais são as duas exigências para uma função ser considerada pura?
Perguntas frequentes
- Uma função pura pode chamar outra função?
- Pode, desde que a função chamada também seja pura. Uma função pura pode ser feita de várias funções puras encaixadas, e o conjunto continua puro. O que a torna impura é chamar algo que lê o mundo externo ou o altera. Compor peças puras é justamente uma das grandes forças desse estilo: verdades pequenas viram verdades maiores.
- Se função pura não imprime nada, como o programa faz algo útil?
- As funções puras calculam; alguém precisa aplicar o resultado no mundo. O programa junta as duas coisas: puras decidem o que fazer, e uma parte impura, pequena e controlada, executa o efeito, salvando ou imprimindo. A próxima aula é sobre isso, isolar os efeitos na borda. A pureza não elimina o efeito, ela o concentra num lugar previsível.
- Ler um argumento que é uma lista mutável quebra a pureza?
- Depende do que a função faz com a lista. Se ela apenas lê a lista e devolve um resultado novo, sem alterar a lista recebida, continua pura. Se ela muda a lista no lugar, aí causa um efeito externo, porque quem chamou vê a alteração, e deixa de ser pura. A regra da aula anterior vale: não mute o que recebeu.
- Números aleatórios podem existir dentro de função pura?
- Sortear um número por dentro torna a função impura, porque a saída deixa de depender só dos argumentos. A saída clássica é receber o aleatório de fora, por argumento, ou receber a semente do sorteio. Assim a parte que decide continua pura e testável, e a geração do acaso fica isolada, controlada por quem chama a função.
- Toda função do meu programa precisa ser pura?
- Não, e nem daria. Programas úteis precisam de efeitos: mostrar algo, salvar, responder a rede. A meta não é pureza total, é concentrar a lógica em funções puras e deixar os efeitos numa camada fina e clara. Quanto maior a fatia pura, mais fácil de testar e entender fica o todo, mesmo que uma parte precise, por definição, ser impura.
- Transparência referencial parece complicado, o que é na prática?
- É a ideia de que, com função pura, a chamada e o resultado são intercambiáveis. Se dobro(4) sempre devolve 8 e não faz mais nada, você pode escrever 8 no lugar da chamada sem mudar o programa. Na prática isso deixa o código previsível e permite ao computador guardar e reusar resultados, porque o valor não vai mudar entre uma chamada e outra.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.