Programação Funcional com OCaml

Por Jakub Jacobsky @ Unsplash

OCaml é uma linguagem de programação industrial com suporte a programação funcional, imperativa e orientada a objetos. Ela pertence a família de linguagens ML (Meta Language). Foi desenvolvida por pesquisadores da INRIA (Institut National de Recherche en Informatique et en Automatique) utilizando ideias de outras linguagens ML, como Standard ML e adicionando novas funcionalidades.

Hoje, OCaml é uma das linguagens ML mais utilizadas, juntamente com SML (Standard ML). Por isso essa linguagem se torna um ótima porta de entrada para aquelas pessoas que desejam conhecer o mundo ML. Possui uma grande comunidade, um ótimo gerenciador de pacotes, e um fantástico sistema de módulos. Temos um ecossistema preparado e provado. Dá para perceber por que grandes empresas financeiras como Jane Street e Bloomberg a escolheram como plataforma para seus softwares.

Este artigo tem como propósito servir de introdução para a linguagem OCaml e para o paradigma funcional. Iremos ignorar as partes imperativas e orientada a objetos. Recomendo não se debruçar seriamente nesse artigo. Escrevi de modo que a leitura seja leve e tranquila, então só aproveite o passeio.

Programação Funcional

Programar nada mais é que escrever um código que irá se transformar num programa. Acontece que existem diversas formas de codificar um código! Uma dessas formas é a funcional. A programação funcional tem forte influência do cálculo lambda. Calma, apesar desse termo parecer intimidador, não veremos nada de teorias matemáticas feitas por PHDs e cientistas malucos. Cálculo lambda são basicamente expressões que podem ser aplicadas a outras expressões. No nosso caso, vamos considerar que existem expressões e valores. Esses valores podem ser aplicados às expressões.

Exemplo:

*1* é um valor
*2* é um valor
*x + y* é uma expressão

Podemos escrever a expressão e aplicação dos valores na seguinte forma:
(x + y) 1 2
O x e y são as variáveis. Variáveis são lacunas na expressão que receberão os valores da aplicação.
Então, a expressão aplicada seria: (1 + 2)

Na notação do cálculo lambda seria assim: (λ x y . x + y) 1 2
Na verdade não seria bem assim, mas simplifiquei para deixar parecido com o exemplo anterior.

Não é necessário saber toda a teoria do cálculo lambda para aprender a programar funcional. Só é preciso saber que existem expressões e aplicar valores a elas. Veremos que nossos códigos em OCaml serão várias expressões que serão calculadas e no final resultam em valores.

De volta ao OCaml

Caso não tenha instalado no seu computador, siga esses passos. Então, abra seu terminal, digite ocaml e pressione Enter. Ao fazer isso, você deve ver uma mensagem mais ou menos assim:

OCaml version <sua versão aqui>
#

Perfeito! Agora você está no interpretador interativo do OCaml. Nele você pode escrever seu código, e, imediatamente o resultado é exibido. Esse “processo” é chamado de REPL (Read-eval-print-loop, ou: Ler-avaliar-exibir-repetir). Funciona exatamente da forma que o nome diz: Primeiro se lê o código a partir do teclado, depois esse código é avaliado/interpretado, depois o resultado da avaliação é mostrado na tela, e finalmente retorna para a primeira etapa, repetindo todo o processo.

Vamos começar a interagir com o OCaml fazendo algumas operações aritméticas. Digite 1 + 1;; e pressione Enter. Então teremos:

# 1 + 1;;
- : int = 2

Essa foi nossa primeira interação com o OCaml. Nela escrevemos nossa expressão: 1 + 1 seguida de dois ponto e vírgula: ;;. Eles servem para indicar ao interpretador que nossa expressão acabou. Se não tivéssemos posto os ponto e vírgula, o interpretador continuaria recebendo entrada.

Percebemos que abaixo da linha do nosso código, o interpretador nos mostrou uma nova linha. Essa é a fase print do REPL. Podemos ver o resultado da operação: 2 e o tipo do resultado: int (inteiro).

Ótimo! Vamos escrever mais expressões e verificar seu resultado.

# 10 - 2;;
- : int = 8
# 3 * 4;;
- : int = 12
# 5 / 2;;
- : int = 2
# (9 * 2) + ((5 - 3) * 7);;
- : int = 32

Viu como o interpretador OCaml serve como uma ótima calculadora? A partir de hoje esqueça a calculadora do seu sistema operacional e use OCaml. :P

Porém há um probleminha. Como vou confiar numa calculadora que diz que 5 / 2 = 2? Calma, o OCaml não errou o cálculo. Acontece que o operador / realiza uma divisão inteira. Se quisermos um resultado com números decimais, devemos utilizar o operador /..
Logo:

# 5 /. 2;;
Error: This expression has type int but an expression was expected of type
float

O interpretador nos mostrou um erro. O motivo disso é que o operador /. espera receber números decimais e não inteiros. Podemos reescrever da seguinte forma:

# 5.0 /. 2.0;;
- : float = 2.5

Agora sim temos o resultado que queremos. Esse erro aconteceu pois OCaml é uma linguagem fortemente tipada. Isso quer dizer que as operações devem seguir os tipos especificados.

Na programação funcional, linguagens fortemente tipadas são extremamente comuns, existem vantagens e desvantagens mas isso veremos depois. Até lá não convide o camelito para sair, ele está programando em OCaml.

Por Isabella Jusková @ Unsplash