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