andrews medina

haskell para pythonistas

escrito em 27/07/2011

No FISL 12 que aconteceu nos dias 29 de junho a 02 de julho de 2011 eu apresentei uma palestra relâmpago cujo o tema foi: “haskell para pythonistas”. A palestra ficou legal, mas 5 minutos é bem pouco para um assunto como esse, então resolvi começar a fazer um “guia” de haskell para desenvolvedores python e esse post é o primeiro dessa série.

Primeiramente, eu não sou um programador haskell fluente, eu apenas utilizei haskell para pequenas brincadeiras, entre elas, resolver algum problemas do projecteuler.net. Mas, já consegui ver várias semelhanças e diferenças entre haskell e python.

paradigma funcional

Diferente de python que é multiparadigma, haskell é puramente funcional. Em linguagens imperativas você passa para o computador uma sequência de tarefas para serem executadas, em uma linguagem puramente funcional você não diz o que fazer mas sim como fazer.

Por exemplo, o fatorial de um número é o produto de todos os números de 1 até esse número. Em haskell a implementação do fatorial seria:

fatorial numero = product [1..numero]

Outro exemplo, seria a sequência de fibonacci. O valor do item de fibonacci com posição 0, deve retornar 0. A posição 1 deve retornar 1 e da posição 2 em diante deve retornar a soma dos valores dos dois itens anteriores na sequência. A implementação em python que é uma linguagem imperativa seria:

def fibonacci(numero):
   if numero == 0:
       return 0
   elif numero == 1:
       return 1
   else:
       return fibonacci(numero - 1) + fibonacci(numero - 2)

Já em haskell:

fibonacci 0 = 0
fibonacci 1 = 1
fibonacci numero = fibonacci(numero - 1) + fibonacci(numero - 2)

lazy evaluation

Haskell só executará o resultado e os parâmetros de uma função quando eles forem necessários. Com esse recurso é possível criar funções que retornem sequências infinitas como a de fibonacci onde é executado apenas os valores necessários:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

tipagem estática

Uma das características que haskell tem que difere de python é ter tipagem estática, mas ela tem inferência de tipos, ou seja, o compilador associa implicitamente o tipo da variável conforme o valor dela, assim, não é preciso declarar o tipo de uma váriavel. Por exemplo:

Prelude> let numero  = 10
Prelude> :t numero
numero :: Integer

list comprehensions

List comprehensions é a capacidade de gerar uma lista a partir de outra lista, assim como python, haskell também tem list comprehensions. Por exemplo em python, se eu quiser gerar uma lista com apenas os números ímpares contidos em outra lista:

>>> [numero for numero in [1, 2, 3, 4, 5, 6] if numero % 2]
[1, 3, 5]

A mesma solução usando list comprehensions em haskell:

Prelude> [numero | numero <- [1, 2, 3, 4, 5, 6], odd numero]
[1,3,5]

A diferença de list comprehension em haskell é que é possivel fazer list comprehensions compostas:

Prelude> [numero1 * numero2 | numero1 <- [1, 2, 3, 4], numero2 <- [1, 2, 3, 4]]
[1,2,3,4,2,4,6,8,3,6,9,12,4,8,12,16]

como começar

Para quem está interessado em começar uma aventura no mundo das linguagens funcionais com haskell, eu indico a instalação do ghc (http://hackage.haskell.org/platform/) que é um compilador para haskell e a leitura do learn you a haskell (http://learnyouahaskell.com), que na minha opinião é um dos melhores livros para quem quer começar a programar em haskell.

blog comments powered by Disqus