Publicado em linguagens, linux, open source

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 hgci:

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 um 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

Anúncios

13 comentários em “A Linguagem Haskell

  1. Um general do exército americano desenvolveu uma estratégia de ataque a guerrilhas terroristas
    armadas localizadas em campos sitiados por recursos naturais, como ilhas, área planas limitadas por montanhas,
    rios etc. A sua estratégia baseia-se em colocar grupos armados em pontos estratégicos o mais próximo possível
    do inimigo, formando uma área retangular – área de “sufoco”. A figura abaixo, mostra três grupos de guerrilhas
    e os grupos armados localizados de forma estratégica, definindo os pontos de sufoco.
    Tarefa
    Você deve desenvolver um programa que permita calcular os pontos onde serão posicionados os
    grupos armados, de forma a cria a menor área disponível aos grupos terroristas. Além disso, o programa deve
    calcular o tamanho dessa área em km2.
    Entrada
    A entrada é composta de uma base de fatos Prolog, contendo vários conjuntos de teste. Os conjuntos
    de testes são formatos por: a) fato para descrever a área geográfica, sendo que a área geográfica é minimamente
    formada por dois inteiros M e N que correspondem às dimensões em km da área geográfica; b) fato
    descrevendo a localização das guerrilhas, sendo cada guerrilha descrita minimamente por dois inteiros X e Y
    representando X e Y coordenadas de localização . Restrições: 0<M<100; 0<N<100; 0<x<M; e 0<y<N.
    Exemplo de Entrada
    Conjunto 1 Conjunto 2
    Fato a 30 30 50 50
    Fatos b 20 21 49 49
    23 23 48 49
    19 21

  2. Olá,

    Alguns de seus exemplos falham na versão do GHCI que estou utilizando (6.6.1).

    São os seguintes:

    Prelude> [‘c’,’a’,’s’,’a’]
    “casa” — no tutorial a saída é [‘c’,’a’,’s’,’a’]

    Prelude> “Kodumaro” == [‘k’,’o’,’d’,’u’,’m’,’a’,’r’,’o’]
    False — no tutorial a saída é True

  3. Olá amigo, não pude deixar de perceber que vc já programou em LISP. Eu estou fazendo um trabalho pra faculdade e tenho que fazer um programa simples em LISP, meu SO é Windows e simplesmento não encontro um compilador que funcione. Será que vc poderia me dar uma mãozinha? Só um compilador e um tutorial…

  4. Cara, plt scheme com dr.Scheme é uma boa(Scheme é um dialeto de lisp)
    Quanto a tutoriais, melhor pegar livro direto, How to Design Programs(HTDP) e o Structure and Interpretation of Computer Programs(SICP) ambos gratutitos e ambos na internet.

  5. Bom dia, esta estudando e fazenod pesquisa sobre o haskell, pois estou com uma tremnenda duvida..tenho que fazer uma lista emensa da programação haskell, será que tem como vocês me ajudarem..

    1) Defina uma função que eleve um Inteiro a uma potência n (Inteira);
    2)7. Defina uma função que indique se uma pessoa tem idade para votar ou não. A idade mínima para votar é de 16 anos;
    3) Defina uma função modulo, que calcule o resto de uma divisão entre Inteiros;

    4) f x y | (x = y) == True
    | otherwise == False esta dando erro não consigo identificar onde esta para corriji-lo!!

    Bom essas são as ultimas que não consegui teria como me ajduar, o quento antes!!??

    Grata Taiana Rodrigues.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s