quarta-feira, 21 de março de 2007

A Linguagem Haskell

haskell (Publicação original:
http://claudiotorcato.wordpress.com/2007/03/21/a-linguagem-haskell/)

O blog comunitário Kodumaro é voltado para linguagens de programação. Pensei então em escolher uma linguagem a mais para comentar. As linguagens que programei durante a minha vida foram: Pascal, C, Object Pascal, Haskell, Prolog, LISP, Java, Python, PHP e VB, nessa ordem. Talvez hajam outras mas como não lembrei foram fracamente utilizadas. Então acabei escolhendo Haskell por ser uma linguagem diferente das demais.

Haskell é uma linguagem de propósito geral, puramente funcional com características diversas tais como, tipagem estática, funções de alta ordem, polimorfismo, classes de tipo e efeitos monádicos. Existem vários compiladores disponíveis livremente para diferentes plataformas.

Poderia dizer que é uma linguagem que irá surpreendê-los, assim como ocorreu comigo no tempo da faculdade. Aos interessados em acompanhar este tutorial recomendo baixar imediatamente alguma implementação de Haskell. Sugiro duas: Hugs e GHC (Vejam nesse site). Para usuários do Windows, eu diria que seria interessante usar a primeira. Já para os geeks do Linux, por favor procurem por GHC. Puxando um pouco para meu lado de usuário Linux da distribuição Ubuntu baixem com esse comando:
sudo aptitude install haskell-compiler


Antes de chegar nos exemplos, gostaria de explicar meu modo de operação para que acompanhem com comodidade. Um jeito cômodo – inclusive primeiramente conheci estudando Haskell – é o uso de um interpretador interativo. Esta ferramenta permite que você interaja com o programa em tempo real. Ou seja, ao inserir uma expressão na linha de comando e clicar no Enter, o interpretador processa a expressão retornando seu valor. A comodidade está no fato de você testar um algoritmo como mais rapidez para integrá-lo ao fonte de uma aplicação em desenvolvimento, ou estudar o funcionamento de alguma biblioteca.

O ghci é o interpretador do GHC. Num terminal de comandos do Linux (ou usando o Hugs no Windows) executemos:
chackero@lain:~$ ghci


Haskell é um resolvedor de expressões. Ele computaciona uma expressão até deixá-la no seu modo mais simples. Assim sendo, o modo mais simples da expressão 2 + 3 é 5. O que funciona para expressões aritméticas funciona para a resolução de funções. Por isso, a explicação. Vejamos no ghci:
Prelude> 2 + 4
6
Prelude> 2 * 4
8


Haskell possui infixação de operadores. É possível colocar o símbolo dos operadores antes dos operandos. Senão, vejamos:

Prelude> (+) 2 4
6
Prelude> (*) 2 4
8
Prelude> (*) 2.0 4
8.0


Para infixação é necessário o uso dos parênteses. No exemplo, vemos polimorfismo quando o operador de multiplicação aceita inteiros e reais como argumentos. Haskell possui funções embutidas. Na verdade, os operadores são açucares sintáticos de funções. Isso é percebido pela forma como se comportam. Alguns exemplos a seguir incluem funções que tratam também de strings.
Prelude> div 10 3
3
Prelude> abs (-23) -- parênteses necessários para que -23 seja tratado como argumento
23
Prelude> negate 10
-10
Prelude> reverse "Kodumaro"
"oramudoK"
Prelude> "Kodumaro" ++ " é legal" -- exemplo de concatenação de strings
"Kodumaro é legal"
Prelude> length "Teste"
5
Prelude> 'a' < 'z' -- operação entre tipo Char
True
Prelude> True && False -- &&: operador booleano E
False
Prelude> True || False -- ||: operador booleano OU
True


Dois sinais de menos iniciam um comentário. Comentários em Haskell só existem para uma linha, não para um conjunto delas.

Funções podem ser tratadas como operadores. Isso é visto no exemplo abaixo:
Prelude> 10 `div` 3
3


Além dos números, booleanos e strings, Haskell possui outros tipos de dados, como as tuplas e as listas. São tipos muito usados na linguagem.

Tupla é uma seqüência fixa de elementos. Esses elementos podem ser de tipos diferentes. Tuplas são representadas por elementos entre parênteses:
Prelude> ("Cláudio",29)
("Cláudio", 29)
Prelude> fst ("Cláudio", 29) -- fst retorna o primeiro elemento da tupla
"Cláudio"
Prelude> snd ("Cláudio", 29, "Computação") -- snd retorna o segundo
29
Prelude> () -- Uma tupla vazia
()


Acredito que exemplos explicam melhor que palavras. Exposto isso vamos às listas, tão importantes para Haskell.

Listas são seqüências de elementos de um mesmo tipo.
Prelude> [2,3,4]
[2,3,4]
Prelude> ['c','a','s','a']
['c','a','s','a']
Prelude> length [2,3,4] -- olha o exemplo de polimorfismo!
3
Prelude> [1..4] -- uma particularidade das listas.
[1,2,3,4]
Prelude> head [1..4] -- a cabeça da lista
[1]
Prelude> tail [1..4] -- a cauda da lista
[2,3,4]
Prelude> "Kodumaro" == ['k','o','d','u','m','a','r','o'] -- Uma string é uma lista de Char!
True
Prelude> head "Kodumaro" -- então isso funciona!
"K"
Prelude> elem 'm' "Kodumaro" -- existe 'm' na string "Koduramo"?
True
Prelude> elem 5 [1..4]
False


Esse primeiro post serve para dar uma amostra do que é Haskell. Ainda veremos muitas coisas daqui em diante. Estou revisando novamente a linguagem e sei que há muitas coisas que não consegui estudar na faculdade, como as tais mônadas, conceito complicado por sinal. Espero que tenham gostado. Obrigado!

Prelude> :quit
blog comments powered by Disqus