Quando modelamos qualquer coisa, simplificamos isso. Mesmo se queremos representar algo tão básico quanto uma gota de água, não pintamos cada átomo na gota.

Em vez disso, tentamos destilar os aspectos mais relevantes do assunto, que são determinados pela finalidade do modelo. Se o nosso propósito é evocar a ideia de uma gota de água, a cor e a forma são provavelmente suficientes.

Modelar não é novidade para nós. Para navegar na esmagadora complexidade de nossas vidas, construímos modelos mentais e agimos com base neles, antes mesmo de conscientemente percebermos isso. Por exemplo, quando eu era muito jovem, ficava ansioso ao ponto de chorar se o sol se punha antes que meus pais me levassem da escola para casa. O processo por trás da minha ansiedade parecia algo assim:

Eu associei o pôr do sol a ter que ir para a cama, o que significava que se eu chegasse em casa depois do pôr do sol, eu não teria tempo para brincar. E menos tempo para jogar significava que eu seria menos feliz.

Quando trazemos modelos cotidianos como esse para nossa mente consciente, somos capazes de investigá-los com as técnicas rigorosas que desenvolvemos em outras disciplinas em que formalmente modelamos. A programação funcional é uma dessas disciplinas.

A programação funcional me ajudou a pensar em por que estou feliz ou infeliz em um determinado momento. Usando exemplos simples de programação e matemática (como 1 + 2 = 3), exploraremos como as práticas de programação funcional podem ser aplicadas à maneira como pensamos.

Somos cercados por funções
Uma função é um processo que recebe uma entrada e retorna uma saída. Por exemplo, uma função addTwo nos daria a saída 4 se fosse dada a entrada 2.

No JavaScript moderno, poderíamos escrever essa função como:

const addTwo = (entrada) => entrada + 2
Em matemática, esta função pode ser descrita assim:

f (x) = x + 2
Como você pode ver, a função não lista todas as saídas possíveis para cada entrada. Em vez disso, há uma fórmula simples x + 2, a partir da qual podemos descobrir rapidamente qual saída obteremos para uma determinada entrada.

Nós interagimos com funções em nossas vidas diárias, mas as fórmulas estão escondidas de nós. Por exemplo, você pode se ver checando seu telefone incessantemente em busca de uma resposta a uma mensagem de texto enviada por você e que achou muito inteligente. Ou foi estúpido? Nesse momento, a conversa é a função mais urgente à sua frente. Você envia mensagens como entradas e recebe mensagens (atrasadas as) como saídas. Se você pudesse decifrar a fórmula por trás da conversa, talvez seu relacionamento com a outra pessoa fosse mais … funcional.

Se diminuirmos os detalhes da conversa, podemos ver que o funcionamento das mensagens de texto é parte de uma jornada maior que leva você a um estado de felicidade (ou infelicidade), como o pôr do sol.

Coisas como uma mensagem de texto ou um pôr do sol podem parecer inconseqüentes no grande esquema da vida, mas é importante reconhecermos seu surpreendente poder sobre nós em um dado momento, nomeando-as como entradas na fórmula que determina nossa felicidade. Quando nos esforçamos para tornar o implícito explícito, estamos “purificando” nossas funções.

Ilustrações: Anirudh Eka
Tornando as Funções Puras
Uma das principais diferenças entre a programação funcional e outras formas de programação é uma insistência no uso de funções puras. Uma função pura toma como entrada qualquer variável que possa afetar a saída. Aqui está um exemplo de uma função que é impura:

deixe um = 2
const addTwo = (entrada) => entrada + a
O addTwo é “não-determinístico”, o que significa que não podemos garantir que receberemos a mesma saída com a mesma entrada sempre. Por exemplo, se nós dermos 3 como entrada para adicionar Dois, a saída será 5. Entretanto, se alguém definir o valor de a para 100, então, de repente, uma entrada de 3 retornará 103. Isso pode nos surpreender, porque usamos a mesma função com a mesma entrada, mas tem algo diferente.

Da mesma forma, na vida, muitas vezes nos surpreendemos quando nosso humor muda de repente, mesmo que os insumos não tenham mudado. Quando isso acontece, é possível que a função que planejamos para modelar nossa felicidade (vamos chamá-la determineHappiness) não esteja explicitamente levando em conta uma entrada.

Por exemplo, quando eu ficava chateado com alguma coisa quando criança, minha mãe costumava dizer que eu estava com fome. Em outras palavras, ela estava afirmando que minha função Determinação da Felicidade era impura.

const hungry = true
const determineHappiness = (input) => … lógica complexa que retorna um estado mais infeliz quando a fome é verdadeira
Para provar que a fome afeta meu humor, teríamos que encontrar uma situação em que todos os insumos que eu reconheci como afetando minha felicidade tenham valores que deveriam me fazer feliz – mas, por algum motivo, ainda estou infeliz.

const sunPosition = ‘logo acima de mim’
determineHappiness (sunPosition)
A posição do sol é “logo acima de mim”, implica que é meio-dia, o que implica que eu tenho muito tempo para jogar, o que significa que eu deveria ser feliz. Se sou infeliz mesmo então, talvez haja algo mais que não considerei que também afete minha felicidade. Se é verdade que eu não comi há algum tempo, talvez minha função também seja absorvida como uma entrada.

const hungry = true
const sunPosition = ‘logo acima de mim’
determineHappiness (sunPosition, faminto)
Mas podemos dizer com confiança que minha felicidade é apenas uma função de estar com fome e com a posição do sol? Obviamente não. Se quisermos que a Felicidade seja verdadeiramente pura, devemos considerar a posição do sol, a fome e um milhão de outras coisas que compõem o meu contexto como insumos para determinar a Felicidade.

determineHappiness (contexto)
Embora este modelo fosse definitivamente mais previsível do meu humor, nunca seríamos capazes de construí-lo porque determinar o contexto seria impossível. Afinal, um modelo é uma simplificação da realidade, uma destilação de apenas as partes mais importantes. Então, quando tentamos modelar nossa felicidade, nunca seremos capazes de desenvolver uma função totalmente pura. Só podemos nos esforçar para chegar o mais perto possível sem introduzir complexidade excessiva.

determineHappiness (sunPosition, hungry) é bastante simples para eu conhecer duas partes do meu contexto que têm um impacto reconhecível na minha felicidade.

Quando tornamos explícitos os insumos de nossa felicidade, nos permitimos a oportunidade de perguntar: “Que insumos posso mudar em meu ambiente para me tornar uma pessoa mais feliz?” Parece simples, mas acho que esse exercício é aterrador muitas coisas desafiadoras ao mesmo tempo.

Eu não preciso resolver todos os meus problemas de uma só vez. Eu só preciso ser capaz de encontrar os insumos mais relevantes e me concentrar naqueles que eu posso fazer alguma coisa. Eu não posso mudar a posição do sol, mas eu posso comer um lanche.

Lembre-se de que os insumos em nossa felicidade estão mudando constantemente, por isso é importante reavaliar continuamente as entradas em nosso modelo de felicidade.

Encontrando as abstrações
Geralmente, sempre que os programadores veem duplicação, tentam removê-lo para que o código seja mais fácil de modificar e manter. Imagine que você tivesse três funções: add2, add3 e add4.

const add2 = (entrada) => entrada + 2
const add3 = (entrada) => entrada + 3
const add4 = (entrada) => entrada + 4
A única diferença entre as três funções é o número no final. Se nós fizermos esse número uma entrada também, poderíamos definir apenas uma função e poder adicionar qualquer entrada a 2, 3, 4 ou qualquer outro número.

const add = (input, other) => entrada + outros
add é uma abstração. Descobrimos o princípio comum que governa add2, add3 e add4, observando o padrão que diz que essas funções são todas adicionáveis. Ser capaz de abstrair nos permite tratar coisas muito diferentes da mesma forma. Cordas e mangas são muito diferentes, mas ambas compartilham o padrão de serem cortáveis. Fazer essa abstração nos permite usar a mesma ferramenta, uma faca, para operar em coisas completamente diferentes. Mas abstrações podem ser difíceis de digerir quando se lida com emoções.

Certa vez, quando fiquei muito triste com um rompimento, minha amiga tentou me confortar comparando-a com o que sentia quando perdia o capuz favorito. Senti-me insultado porque ela estava comparando minha perda com algo tão mundano quanto roupas extraviadas. Mas, de certa forma, a comparação foi justa. Ambas as experiências compartilham a abstração de perder algo ao qual alguém está ligado.

Embora o rompimento possa ter sido uma experiência nova para mim, a perda não foi. Assim como a faca, eu poderia reutilizar ferramentas para lidar com uma situação desconhecida, reconhecendo uma abstração familiar.

O empatia é reconhecer a abstração comum entre sua experiência e a experiência de outra pessoa. Quando alguém lhe diz “Eu entendo o que você está passando”, mesmo que eles não tenham tido a mesma experiência, é isso que eles estão fazendo.

Quando você responde: “Não, você não”, isso significa que a abstração não está bem formada ou que detalhes importantes exclusivos da sua experiência estão perdidos na abstração. Fogo e sol dão calor, mas para uma floresta, um devora as árvores enquanto o outro as alimenta.

Uma função polimórfica
Agora, vamos ver se podemos encontrar uma abstração comum entre uma conversa de mensagem de texto e a posição do sol.

Você pode pensar nas setas como funções que pegam as entradas à esquerda e produzem as saídas à direita. A duplicação está em azul.

Vamos extrair a função interpretativa comum e tratá-la como outra entrada para o que determina nossa felicidade.

determineHappiness (contexto, interpretar)
Para que isso funcione, interpretar precisa ser capaz de lidar com qualquer coisa que a vida nos ofereça, desde respostas de mensagem de texto até as posições do sol. Uma função que aceita muitos tipos de entradas é denominada “parametricamente polimórfica”.

Um otimista ou pessimista iria dar um passo além e mapear qualquer coisa para um único estado de felicidade, feliz ou infeliz, respectivamente.

const optimisticInterpret = (qualquer coisa) => “feliz”
Ao tratar interpretar como uma entrada para o que determina nossa felicidade, estamos sugerindo que, mesmo no mesmo contexto, diferentes perspectivas levarão a diferentes estados de felicidade.

Durante muito tempo, essa visão me levou a acreditar que deveria concentrar meus esforços na mudança de interpretar, porque a interpretação está em minha mente, enquanto o contexto está no mundo exterior. Teoricamente, interpretar é mais sob meu controle do que a posição do sol ou até mesmo a fome.

Mas a linha entre contexto e interpretação está embaçada. Nossos contextos passados ​​vivem da maneira como interpretamos nosso contexto atual. Se eu queimei mal a minha mão ontem, o contexto do incêndio pode ter desaparecido, mas isso ainda afetará a maneira como eu respondo às coisas que toco hoje.

Estou tentando abordar a tristeza, a solidão, a ansiedade, o medo, o ciúme e até a alegria, como fenômenos tão naturais e às vezes tão incontroláveis ​​quanto a posição do sol. Há coisas em nossa interpretação que podemos controlar e coisas que não podemos. O mesmo vale para o nosso contexto.

A mente é um lugar incrível. É o universo filtrado pelos nossos sentidos. Tem vulcões e fatos científicos do sexto ano. Tem arrependimentos e letras de músicas e o tom da voz do seu amigo quando você os chamou pela última vez. E tem um observador para assistir tudo. Esse pobre tolo tem a infeliz responsabilidade de esboçar tudo o que está diante deles em um segundo. Podemos culpá-los por perder uma vírgula ou um cometa?

Um modelo é uma observação da realidade sobre a qual diligentemente agimos para sobreviver. Podemos direcionar nossa atenção para o foco para observar como observamos nossa realidade, em vez de simplesmente reagir a ela. Podemos colocar os vulcões que atraem nossa atenção dentro do contexto de tudo ao seu redor.

A mente é nossa ferramenta para entender, mas talvez seja a coisa mais difícil de entender. Mas, ao contrário da maioria das coisas, entender a mente é apenas o suficiente para mudar como ela funciona.