Introdução à Programação Funcional com Haskell
A programação é uma arte que pode ser entendida de várias maneiras. Historicamente, a visão mais comum é a de que o programador fornece uma sequência de instruções a um computador para fazê-lo se comportar de uma maneira específica. Esse modelo de programação vincula o programador ao design de uma ferramenta específica, o computador. Neste tipo de programação, o computador é um dispositivo que recebe entrada, acessa memória, envia instruções para uma unidade de processamento e, finalmente, entrega a saída ao usuário. Esse modelo de computador é conhecido como arquitetura von Neumann, em homenagem ao famoso matemático e físico John von Neumann.

A linguagem de programação que melhor incorpora essa maneira de pensar sobre programas é o C. Um programa em C recebe dados da entrada padrão controlada pelo sistema operacional, armazena e recupera valores necessários na memória física que frequentemente deve ser gerenciada manualmente, requer o manuseio de ponteiros para um bloco específico de memória e, finalmente, retorna toda a saída através da saída padrão controlada pelo SO. Ao escrever programas em C, os programadores devem entender tanto sobre o problema em questão quanto sobre a arquitetura física do computador à sua frente.
No entanto, um computador construído com a arquitetura von Neumann não é a única maneira de realizar cálculos. Os humanos realizam uma ampla variedade de cálculos que nada têm a ver com alocação de memória e conjuntos de instruções: organizar livros em uma prateleira, resolver uma derivada de uma função em cálculo, dar direções a amigos, etc. Quando escrevemos código em C, estamos programando para uma implementação específica de cálculo. John Backus, líder da equipe que criou o Fortran, questionou em sua palestra do Prêmio Turing: “A programação pode ser libertada do estilo von Neumann?”

A programação funcional tenta libertar a programação do estilo von Neumann. As fundações da programação funcional são noções abstratas e matemáticas de cálculo que transcendem uma implementação específica. Isso leva a um método de programação que muitas vezes resolve problemas simplesmente descrevendo-os. Ao focar no cálculo, não nos computadores, a programação funcional dá ao programador acesso a abstrações poderosas que podem tornar muitos problemas desafiadores muito mais fáceis de resolver.
O preço disso é que começar pode ser muito mais difícil. As ideias em programação funcional são frequentemente abstratas, e devemos começar construindo a ideia de programação a partir dos primeiros princípios. Muitos conceitos precisam ser aprendidos antes que possamos construir programas úteis. Ao trabalhar nestes posts, lembre-se de que você está aprendendo a programar de uma maneira que transcende a programação de um computador.
Assim como o C é a quase perfeita encarnação do estilo de programação von Neumann, Haskell é a linguagem de programação funcional mais pura que você pode aprender. Como linguagem, Haskell se compromete totalmente com o sonho de Backus e não permite que você volte aos estilos mais familiares de programação. Isso torna o aprendizado de Haskell mais difícil do que muitas outras linguagens, mas aprender Haskell torna impossível não ganhar insights profundos sobre programação funcional à medida que você avança. Ao final destes posts, você terá uma base sólida o suficiente em programação funcional para entender os conceitos básicos de todas as outras linguagens de programação funcional, além de estar preparado para sua jornada de aprendizado em Haskell.
Prática
Vamos executar um exemplo breve, em outros posts vamos nos aprofundando.
Passo 1: Configurar o Ambiente
Antes de começar, certifique-se de que você tem o Stack, uma ferramenta de desenvolvimento Haskell, instalada em seu sistema.
Passo 2: Criar um Novo Projeto
Abra um terminal e crie um novo projeto Stack:
stack new sumProject
cd sumProject
Isso cria uma nova pasta chamada sumProject
com uma estrutura de projeto básica.
Passo 3: Adicionar Dependências de Teste
Edite o arquivo package.yaml
e adicione hspec
na seção de dependências de teste:
tests:
sumProject-test:
main: Spec.hs
source-dirs: test
dependencies:
- sumProject
- hspec
Passo 4: Escrever um Teste
Antes de implementar a função de soma, vamos escrever um teste para ela. Crie um arquivo de teste em test/Spec.hs
:
import Test.Hspec
import Lib
main :: IO ()
main = hspec $ do
describe "sumFunction" $ do
it "correctly sums two numbers" $ do
sumFunction 5 3 `shouldBe` 8
Este teste verifica se a função sumFunction
retorna a soma correta de dois números.
Passo 5: Implementar a Função
Agora, implemente a função sumFunction
no arquivo src/Lib.hs
:
module Lib
( sumFunction
) where
sumFunction :: Int -> Int -> Int
sumFunction x y = x + y
Passo 6: Executar o Teste
Volte ao terminal e execute o teste:
stack test
Se tudo estiver correto, o teste passará, indicando que a função sumFunction
está funcionando conforme esperado.
Parabéns! Você acabou de desenvolver uma função de soma simples em Haskell usando TDD. Este processo ajuda a garantir que o código atenda aos requisitos antes mesmo de ser completamente desenvolvido, além de facilitar a manutenção e a compreensão do código no futuro. Continue explorando TDD e Haskell para aprimorar suas habilidades em programação funcional!
Não se preocupe, esse exemplo foi jogado, mas a ideia é somente vocês conhecerem, vamos passo a passo nos próximos posts.
Referências

