sábado, 1 de fevereiro de 2014

Haskell: Lazy Evaluation e Listas

E aí galera!

Continuando na saga Haskell, hoje vou falar a respeito de uma de suas maiores características: Lazy Evaluation. (Avaliação Preguiçosa)



O que é Lazy Evaluation?
É uma estratégia utilizada para avaliação de funções. Ela consiste em não avaliar nenhuma subexpressão ou função até que seu retorno seja conhecido como necessário, ou seja, no momento em que o valor, da expressão ou função, for requisitado para continuidade da função, ele será calculado.

Quais são as vantagens?
- Melhor desempenho ao evitar cálculos desnecessários, evitando condições de erro na avaliação de expressões compostas.
- Habilitade de representar potencialmente estruturas de dados infinitas, exemplo:
Você precisa fazer a soma de a partir de n até o infinito:

-- A função lista, recebe um inteiro e retorna uma lista de inteiros dados a partir de n

lista :: Int -> [Int]
lista = n : lista (n + 1)

Ou seja, a função lista gera infinitos números para uma lista de inteiros a partir de um número passado como parâmetro. Vamos executar esse código:
Main> lista 5
lista 5 = 5 : lista (5 + 1)
        = 5 : 6 : lista (6 + 1)
        = 5 : 6 : 7 : lista (7 + 1)
        ...
        ....
        .....
        ......

A soma só é executada quando necessária :).

Para maior compreensão do exemplo que citei, vou deixar algumas noções sobre Listas em Haskell.

Listas
Uma lista é uma estrutura de dados que representa uma coleção de objetos homogêneos. Ou seja, objetos que são do mesmo Tipo de Dado.

Listas em Haskell
Uma lista em Haskell é composta por head (cabeça) e tail (corpo). A cabeça é o primeiro objeto da lista, por onde é feito o nó de acesso da lista. A partir dela(head) temos acesso aos objetos que estão no tail da lista.

Para criar uma lista em Haskell é bem simples:
-- Lista de números
fibonacci :: [Int]
fibonacci = [1, 1, 2, 3, 5, 8]
-- Lista de Char
nome :: [Char]
nome = ['A', 'B', 'C', 'D']
-- Lista de String
lista_char :: [[Char]]
lista_char = ["Haskell", ['H', 'A', 'S', 'K', 'E', 'L', 'L']]
-- A string "Haskell" é uma lista de Char

Legal né?

Para criar uma lista vazia:
[]


Pronto, alguns exercícios serão os melhores exemplos.
Vá ao seu terminal e entre no interpretador Hugs.

Digite:

Main> 1 : []

[1]


Main> 1 : 2 : 3 : []

[1,2,3]


Acho que deu pra perceber o que estamos fazendo né? Adicionando elementos a lista. Bem simples, com o caractere ':' nós adicionamos elementos a lista.

Podemos até mesmo fazer comparações de listas:
Main> [1,2,3] == (1 : 2 : 5 : [])

False


Main> [a,b] == [b, a]

ERROR - Undefined variable "b"


Por que vemos esse erro?
Simplesmente porque estamos a usar um tipo de dado Char, que DEVE vir entre ' '.

Main> ['a', 'b'] == ['b', 'a']

False


Pronto.
Não se esqueça também que os elementos de uma lista estão entre [ ] e separados por vírgula.

Galera, por hoje é só. Qualquer dúvida, comente abaixo ou email-me: abner.terribili@gmail.com.

Cheers!





Nenhum comentário:

Postar um comentário