Aprendendo FP – Primeiros Passos

Há um tempo atrás eu manifestei o meu interesse pela programação funcional (FP). O tom do texto foi minha preocupação em talvés não consegui aprender algo como FP. Desde então eu decidi provar que eu estou errado. Bom, eis aqui as minhas primeiras impressões sobre minhas incursões no mundo da programação funcional.

Primeira decisão a ser tomada, foi qual linguagem escolher? Escolho o purismo do Haskell? A popularidade do Scala? Simplicidade do JavaScript? Mas o Whatsapp é feito em Erlang? Talvés o nacionalismo fale mais alto e vou de Elixir? E Lisp? E F# (dizem que está morrendo, não sei…)? Que decisão!!!

Após ler muitos posts e muitas questões respondidas no Quora acabo por decidir pela linguagem Racket.

Baterias Incluídas

Não vou transcrever nenhum texto do site official, tentarei descrever com as minhas próprias palavras o que é a linguagem Racket.

É uma linguagem puramente funcional, ou seja, tudo é função, incluindo o IF e LOOPs. O programa inteiro é uma função! Uma aproximação grosseira é comparar Racket com as funções do Excel. Veja um exemplo de condição escrito em Racket:

(define (reward s)
(cond
 [(<= 0 s 10) "bronze"]
 [(and (< 10 s) (<= s 20)) "silver"]
 [else "gold"]))

Primeira coisa é definir uma função, “reward” com um parâmetro de entrada “s”. Na definição da função temos a chamada de uma segunda funcão, “cond” que retorna um valor de acordo com uma sequência de comparações. Por exemplo, veja a comparação abaixo:

(<= 0 s 10)

O resultado retorna “true” se o valor de “s” form igual ou maior que zero ou for menor ou igual a 10. O equivalente a “0 <= s <= 10”.

[(<= 0 s 10) "bronze"]

Então, se a condição for “true” a função “cond” retorna a string “bronze”.

Repare que na segunda condição, usei a função “and”. Se o valor de “s” for maior que 10 E for maior ou igual a 20, a condição retorna “true” e a função “cond” retorna a string “silver”.

[(and (< 10 s) (<= s 20)) "silver"]

O bacana da Racket é que tudo, absolutamente tudo é uma função. Isso pode parecer banal, mas essa forma de pensar pode mudar muito a sua forma de pensar.

É uma linguagem didática derivada de outra linguagem pedagógica chamada Schema, ou seja, não espere encontrar nenhuma aplicação em produção escrita em Racket, mas nem por isso é uma linguagem para crianças, existe uma comunidade muito grande incluindo aplicações bem complexas, incluindo um servidor web escrito puramente em Racket!

A escolha de Racket não poderia ser mais acertada. Eu tenho uma linguagem puramente funcional, sem ser super complicada como um Haskell ou Erlang. Para efeitos didáticos, a escolha de uma linguagem puramente funcional é crítica, assim não caio na tentação de seguir pelo caminho imperialista (afinal 15 anos de ABAP não são facilmente deixados de lado).

Outro fator a favor da linguagem Racket é não ser profissional, ou seja, ela foi criada com o objetivo de ser usada no ensino de programação. Esse fator pesou muito a favor, pois tenho consciência do bloqueio que meu cérebro tem em entender FP e usar uma liguagem que tem o ojetivo de ensinar matemática para alunos do ensino médio seria perfeita para mim. Somado a isso, todo o ambiente de programação para testes e depuração já está incluso e extremamente fácil de instalar (bem diferente do MiniSAP), sendo assim não perderia tempo configurando o ambiente de trabalho, o que não é meu foco de estudo.

Escolha do Método de Aprendizado

Um terceiro fator a favor da linguagem Racket foi o livro escolhido para o estudo, How to Design Programs ou HtDP (Como Projetar Programas). Numas das respostas no Quora, alguém mencionou esse livro e por curiosidade lí o Prólogo e logo gostei da abordagem do autor.

Em outras palavras, posso dizer que o terceiro fator veio antes dos dois fatores acima. Estava decidido em seguir o livro da Miran Lipovača, Learn You a Haskell for Great Good!, mas ao tomar conhecimento do HtDP, acabei mudando de idéia.

Como usaria a minha metodologia de estudo, a escolha do livro livro é crucial e por isso todo o cuidado na escolha do mesmo.

“Já tá chegando?”

Nesse verão (lembra que estou nos EUA e aqui é verão), eu e a minha família rodamos mais de 5000 Km de carro (uma viagem para para Orlando, FL e outra para Toronto, Canadá). Eu sabia que as duas viagens seriam cansativas e bem difícil, especialmente com três crianças. “Já tá chegando?” foi a pergunta que mais ouvi no carro, incluindo variações como, “estamos chegando?”, “falta muito?”, “já chegamos?”.

A mesma coisa está sendo a minha jornada no mundo FP. A todo momento me pergunto, “já está acabando?”. Mas assim como as minhas duas viagens de carro, seguir o livro How to Design Programs usando a minha metodologia será bem cansativo e trabalhoso. Preciso ficar me lembrando a todo momento que um dos objetivos em aprender FP não é começar a trabalhar com Haskel ou Erlang, mas sim melhorar a minha forma de pensar: “wax on wax off”…

Por exemplo, lá pelo exercício 50 (o livro tem 504 exercícios no total) decidi que já estava bom (em outras palavras desisti) e parti para UI5. Estudei o livro do Fábio inteiro, o que foi muito bom. Mesmo assim, ainda pensava se valeria a pena a voltar com FP e HtDP. Afinal, qual a vantagem de estudar uma linguagem que não teria proveito profissional direto?

Mas o estudo de programação funcional mostrou o seu valor…

Nessa semana eu precisei resolver um erro em uma lógica escrita por mim há ums 2-3 meses, antes de começar meus estudos em FP, usando cerca de 80 linhas. Olhando novamente o problema, rescrevi a mesma lógica em cerca de 15 linhas! Afirmo com toda certeza que essa melhora veio da maneira de pensar diferente proporcionada pela Programação Funcional, ou seja, o fato deu fazer uma série de exercícios usando Racket melhorou a forma como eu resolvi um problema em ABAP. Isso deu uma nova cor a minha viagem pelo mundo FP usando Racket-HtDP.

Sendo assim, decidi voltar para a estrada e continuar meus estudos. Está claro para mim que será uma longa viagem, mas colherei ótimos frutos.

Finalmente posso afirmar que sim, cachorro velho pode aprender truques novos!

Você pode gostar...

1 Resultado

  1. Erick disse:

    Furlan excelente post,
    Eu comecei a me interessar por FP em meados de 2014 quando as comunidades que eu participo não paravam mais de citar palavras como: Clojure, Scala, Erlang e até Java passou a ser uma lambda language.

    Estava bem no inicio das minhas atividades com o ABAP e por isso segurei um pouco, mas em POO o assunto paralelismo e concorrência sempre foram desafiadores e eu sempre curti muito, e até onde estudei são assuntos matadores em FP.

    Pure Functions e Immutable State são as boas respostas, você poder executar uma função diversas vezes em diferentes núcleos ou máquinas e sempre ter a mesma saída é sensacional, e de forma muito mais prática não tem preço.

    E eu tenho que dizer que por admirar demais o Jose Valim optei pelo Elixir, não fiz nada ainda grandioso mas já é mais motivador ver uma galera com Elixir em produção e rodando bem.

    Flw!