(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-compilerAntes 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:~$ ghciHaskell é 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
8Haskell 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.0Para 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
TrueDois 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
3Alé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]
FalseEsse 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
CC-BY: Os textos deste blog podem ser reporduzidos contanto que sejam informados autor e origem.