Algumas das curiosidades de Haskell!

Algumas informações e curiosidades de Haskell que acabei esquecendo de colocar nos meus slides, fique a vontade :-)

Como escrevi em outro post, sou um estudante iniciante em programação funcional e adotei Haskell como uma das minhas linguagens favoritas. Como dito na outra postagem também, falei duas vezes sobre o assunto, a primeira vez no FLISoL 2014 e a outra vez na semana acadêmica de Ciência da Computação aqui na UFFS.

Segue algumas das características que não coloquei nos slides:


Guarded Equations

Vou ser sincero, quando vi isso pensei que não me ajudava em nada, mas hoje vejo que a sintaxe é muito mais simples e elegante do que o famoso if then else then bla bla bla.

É melhor enteder via exemplos:

post a b 
    | a < b     = b
    | otherwise = a

O que isso significa? Bem, é uma função em Haskell que recebe dois argumentos (a, b) e retorna o maior entre eles. Lógico, se os dois valores forem iguais, o maior número vai ser ele próprio.

Qual a relação com if-else?

if (a < b){
    return b;
}
else {  
    return a;
}

É isso a relação, não fica mais fácil?

Para comprovar que a função post funciona, adicionei o código no arquivo function.hs e executei no interpretador ghci, no terminal digite:

$ ghci
Prelude>:set prompt "$ "
$ :l function.hs
[1 of 1] Compiling Main             ( function.hs, interpreted )
Ok, modules loaded: Main.

$ post 2 3
$ 3

$ post 3 2
$ 3

$ post 333 333
$ 333

$ post 'a' 'z'
$ 'z'

Pattern matching

Esse recurso é simplismente sensacional!

Haskell reconhece "padrões" que são descritos pelo programador, veja só essa função andN que criei.

andN _ False        = False
andN False _        = False
andN True True      = True

Essa função simula a função AND entre valores lógicos (True e False). Lógico que é possível ajustar para que fique mais compacto, mas essa é uma forma fácil de entender pattern matching.

A função recebe dois parâmetros, na primeira linha dizemos que se o segundo parâmetro for False, independente do primeiro, a resposta sempre será False.

andN _ False        = False

Na segunda linha dizemos que se o primeiro parâmetro for False, independente do segundo, o resultado será False.

andN False _        = False

E na terceira linha é referente quando os dois forem True, que deverá retornar True.

andN True True      = True.

Era isso, valeu!

Written on October 27, 2015