Uncategorized

O que é uma função pura?

Uma função pura é aquela que não provoca efeitos colaterais, ou seja, ela não muda qualquer estado na aplicação. Mas não é só isto, ela precisa sempre gerar o mesmo resultado com os mesmos argumentos, ou seja, ela precisa ser completamente determinística.

A filosofia da programação funcional é que estados mutáveis causam problemas. E é verdade, causa mesmo. Claro que ter sempre estados que não mudam geram outros problemas. Note que é virtualmente impossível criar uma aplicação que faça algo útil sem alguma mudança de estado.

Se o resultado de um função é sempre o esperado é mais fácil lidar com aquela função.

Então seu uso tem a ver com facilitar o desenvolvimento, mesmo que isto cause, eventualmente, uma perda de performance. Por isso as linguagens mais pragmáticas só usam imutabilidade quando realmente é útil e não traz outros problemas.

Uma das dificuldades de uma função impura é que ela só pode ser usada em outras funções impuras já que uma impura contamina a pura.

Quando a função só gera um resultado determinístico e não muda estado fica mais entender o seu funcionamento, o fluxo de operações é mais previsível, é mais fácil depurar e testar o código, é preciso depurar menos código já que tende a ter menos erros, é muito mais fácil lidar com concorrência e paralelização, e é mais fácil fazer coisas complexas dada a simplicidade dela, o que inclusive permite otimizações agressivas.

Ao contrário do que muita gente pensa não é o algoritmo que é difícil de lidar é a estrutura de dados. É ela que sempre dá problema. Não é o comportamento e sim o estado. A não ser que o algoritmo seja muito complexo e mal feito.

Por isso muita gente acha que OOP é a oitava maravilha do mundo. Ela tende facilitar a melhor estrutura de dados (ainda que a maioria das pessoas entendem errado e mais dificultam que facilitam, e que não é bem OOP e sim a modularização que faz isto ocorrer), só que OOP ainda prega a mutação de estado, prega que o comportamento altere o estado.

Os funcionalistas consideram OOP uma porcaria porque o estado muda muito. Os pragmáticos sabem quando usar cada coisa. E para isto tem que entender o que está fazendo, o que não é fácil porque não existe receita de bolo e existe muita informação que precisam ser combinadas para tomar a decisão certa.

Então devemos preferir o estado que não muda sempre que isto não cause outros problemas, de performance, por exemplo. Devemos preferir comportamentos que não mudam estado e que não se valem de estados que podem mudar, estes comportamentos são puros.

Uma função que acesse algo externo à aplicação não pode ser pura. Qualquer entrada de dados (ler teclado, acessar armazenamento, receber pacote de rede, acessar outra aplicação, pedir algo para o sistema operacional como o relógio, etc.) ou qualquer cálculo que depende do estado de alguma coisa que a aplicação não controle e não possa garantir que o estado é sempre o mesmo (geração randômica verdadeira é o maior exemplo de algo que deve dar um resultado que depende de um estado não determinístico, tem função randômica que é determinística, embora precisa ser usada de forma específica para ser pura). Para ajudar lidar com isto a linguagens funcionais possuem monads.

Funções matemáticas de forma geral são puras. O que trabalha com tipos por valor passadas por valor costuma ser puro, o que trabalha em algo por referência que seja um objeto imutável costuma ser puro.

Academicamente costuma-se atribuir estas características para uma função pura:

Fontes:

https://pt.stackoverflow.com/questions/255557/o-que-%C3%A9-uma-fun%C3%A7%C3%A3o-pura

Publicidade
Padrão

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s