quinta-feira, 29 de março de 2007

A Linguagem Haskell: Listas - Parte 2

haskell Listas

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
blog comments powered by Disqus