Introdução à Programação Funcional com Haskell

Introdução à Programação Funcional com Haskell
Photo by David Monje / Unsplash

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.

Von-Neumann Model

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?”

Integral Calculus: Definition, Formula, Theorems, Types, Methods
Integral

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

Von-Neumann Model - javatpoint
Von-Neumann Model with introduction, evolution of computing devices, functional units of digital system, basic operational concepts, computer organization and design, store program control concept, von-neumann model, parallel processing, computer registers, control unit, etc.
Integral Calculus: Definition, Formula, Theorems, Types, Methods
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

Read more