Publicado em linguagens

A Linguagem Haskell: Listas – Parte 2

HaskellListas

As listas são parecidas com as tuplas mas diferente destas você pode ter quantidades variadas de elementos, em contra-partida homogêneos (de mesmo tipo). Uma lista é representada por elementos separados por vírgulas todos eles cercados por colchetes.


Prelude> [5,2]
[5,2]
Prelude> [1,2,3]
[1,2,3]
Prelude> [] -- uma lista vazia
[]

Como as listas são mutáveis, podemos com facilidade acrescentar elementos a elas. O operador para fazer isso chama-se cons, representado por dois pontos. A sintaxe para isso é mostrada nos exemplos abaixo:


Prelude> 3 : [2,2]
[3,2,2]
Prelude> 3 : []
[3]
Prelude> 1 : 6 : [7, 5]
[1,6,7,5]
Prelude> 3: [] == [3]
True
Prelude> 'c' : 'a' : 's' : 'a' : []
“casa”
Prelude> “casa” == 'c' : 'a' : 's' : 'a' : []
True

A sintaxe de [5,2] é um açucar sintático de 5 : 2 : []. Relembrando que as listas somente aceitam elementos homogêneos. Para não esquecermos, vejamos mais exemplos:


Prelude> ['c','a','s','a']
“casa”
Prelude> [ (1,1), (1,2), (1,3)]
[ (1,1), (1,2), (1,3)]
Prelude> [ [2], [7], [-1] ]
[ [2], [7], [-1] ]

Podemos concatenar listas com o operador ‘++’.


Prelude> [1] ++ [3,4]
[1,3,4]
Prelude> [1] ++ [3] ++ [4]
[1,3,4]
Prelude> “ca” ++ “sa” -- claro que vale para strings
“casa”

Se desejamos realizar operações aritméticas com números que são strings, usamos a função read para converter. Já quando queremos tratar um número como uma string, convertemos o mesmo com a função show. Os exemplos demonstram isso:


Prelude> read ('3' : []) + 5
8
Prelude> read “20” * read “5"
100
Prelude> tail “came” ++ show 32
“ame32”

Existem duas funções em Python que foram herdadas de Haskell, penso eu. É a map e a filter. Map toma uma função e uma lista como argumentos, e retorna uma lista do resultado da operação da função sobre cada elemento da lista-argumento. Já filter somente adiciona na nova lista os elementos que operados com a função retorne True. Exemplos são melhores que minha explicação:

Prelude> map Char.toUpper "escola"
“ESCOLA”
Prelude> filter Char.isUpper "Kodumaro"
"K"

Com isso terminamos mais um post sobre Haskell. No tutorial anterior esqueci de colocar os links para os materiais de referência. Eles podem ser encontrados no site oficial da linguagem. No entanto, minha leitura principal é Yet Another Haskell Tutorial.

Exercício: Use map para converter uma string em uma lista de booleanos, cada elemento na nova lista representando se o elemento original estava em maiúsculas ou não. Exemplo: “teSte” produzirá [False, False, True, False, False]

Prelude> :quit

Anúncios

3 comentários em “A Linguagem Haskell: Listas – Parte 2

  1. Legal Torcato!

    Estou gostando de Haskell – pena que não estou conseguindo instalar o ghc. =(

    Uma coisa que percebi – e que você me esclareceu via GTalk – é que o operador : avalia a expressão da direita para a esquerda, como o operador de atribuição =.

    Isso porque seu uso é:

    elemento : lista

    E em:

    ‘c’ : ‘a’ : ‘s’ : ‘a’ : []

    Se ele avaliasse da esquerda para direita (como a maioria dos operadores), teríamos primeiro um ‘c’ sendo colocando na lista ‘a’. =P

    Então ele avalia assim:

    ‘c’ : ‘a’ : ‘s’ : ‘a’ : []
    ‘c’ : ‘a’ : ‘s’ : [‘a’]
    ‘c’ : ‘a’ : [‘s’, ‘a’]
    ‘c’ : [‘a’, ‘s’, ‘a’]
    [‘c’, ‘a’, ‘s’, ‘a’]

    Que no final é igual a “casa”. =)

    Valeu pelo ótimo artigo, Torcato!

    []’s

  2. Estava estudando os artigos e descobri como se faz um pig-latin em Haskell:

    tail var ++ (Char.toLower (head var)) : “a”

    Por exemplo:

    Prelude> let var = “Kodumaro”
    Prelude> tail var ++ (Char.toLower (head var)) : “a”

    []’s

  3. Preciso resolver essa questão alguém pode me ajudar a resolver:
    Escreva uma função em Haskell para concatenar duas listas de um mesmo tipo t desconhecido.

    Agradeço desde já.

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