Arquivo para a categoria 'Livros'

10
Mar
09

Labirinto em Haskell – tail recursion

Enquanto estava estudando a linguagem de programação Lua, em um capítulo sobre elementos funcionais da linguagem, me deparei com uma explicação interessante para tail recursion. Nela, o autor do livro (Programming in Lua, 1ª Edição) falava como a linguagem implementa completamente tail recursion(que acho que fica bem traduzido como recursão de cauda). Até aí tudo legal, mas melhora.

Bem, pra demonstrar que implementa e também explicar o conceito, o autor se utiliza de um jogo-exemplo: um labirinto. O jogo constrói o labirinto através de funções que chamam umas às outras, porém utilizando-se de recursão de cauda para manter sempre o uso de memória como se só houvesse uma função. Explicação e o exemplo utilizado podem ser encontrados aqui.

Explicando melhor recursão de cauda: o princípio é que não precisamos que uma função fique esperando o retorno de um resultado de outra para terminar sua execução, como acontece normalmente. Se você faz uma função em C, ou um método em Java, que termina com um comando return outraFuncao;, a função original ficaria esperando o termino da chamada para poder terminar sua execução. Só que outraFuncao pode fazer chamadas a outras funções, e essas a mais outras, e assim por diante. Tal carga será deixada para a memória, que acabará por estourar(um stack overflow, ou estouro de pilha). Mas perceba que, no caso de uma instrução final de uma função, não há motivo para a espera de retorno da chamada. Pode-se simplesmente indicar que o retorno será o da função agora chamada, e limpar a memória utilizada pela execução da original. É isto que linguagens funcionais como Haskell e Scheme e linguagens com fortes influências, como Lua, implementam.

A novidade que gostaria de compartilhar aqui é uma implementação do mesmo código feito em Lua, para Haskell. O código pode dar origem a um jogo bastante complexo e infinitamente escalável, já que ao chamar uma nova função (entrar em um novo quarto) nenhuma informação é mantida da que chama, e sua execução é encerrada por completo. Código em Haskell abaixo:

import IO

main = do
         room1

room1 = do
          putStrLn "You're in room #1"
          text <- getLine
          if text=="south" then
            room3 -- movendo-se pro quarto 3
            else
              if text=="east" then
                room2 --movendo-se pro quarto 2
                else
                  putStrLn "Invalid move" >>
                  room1 --permanece no mesmo quarto

room2 = do
          putStrLn "You're in room #2"
          text <- getLine
          if text=="south" then
            room4
            else
              if text=="west" then
                room1
                else
                  putStrLn "Invalid move" >>
                  room2 

room3 = do
          putStrLn "You're in room #3"
          text <- getLine
          if text=="north" then
            room1
            else
              if text=="east" then
                room4
                else
                  putStrLn "Invalid move" >>
                  room3 

room4 = do
          putStrLn "You're in room #4! You won!"

O código é simples, elegante, e correto. É este mesmo comportamento que torna a recursão um ponto tão forte em Haskell: iteração não é necessária à linguagem pois recursividade não apresenta peso adicional algum ao código. Isto nos permite escrever funções recursivas muito mais poderosas do que podemos encontrar em uma linguagem como C ou Java, onde a pilha de execução não suporta tantas chamadas quanto uma tarefa mais complexa possa precisar(ex.: inserção em uma árvore AVL com 100 mil nós). Isso nos permite executar códigos como o clássico exemplo do fatorial:

fact x = if x < 0 then error"Fatoriais sao de numeros positivos!"
                       else fact2 x 1 where
                              fact2 0 acumulador = acumulador
                              fact2 x acumulador = fact2 (x-1) (acumulador*x)

Pode-se rodar este exemplo e calcular o fatorial de 100 mil, o que não é possível com recursão em C. Apesar do peso do alto nível de abstração, vemos aí parte do poder do paradigma funcional e da linguagem Haskell!

PS: Erro corrigido no quanto à recursividade do fatorial. Ah, e o exemplo do fatorial pode não dar Stack Overflow, mas dependendo da entrada você pode atingir picos de uso de CPU. =)

06
Dez
08

Novo livro sobre Haskell

Capa do livro Real World Haskell

Real World Haskell

Há um novo livro disponível sobre Haskell: a O’Reilly acabou de lançar, em novembro, o livro Real World Haskell. Para melhorar, o conteúdo está disponível livremente para leitura!

Até onde olhei (pouco mais do que o índice) parece um livro bom. Em geral acho os livros da O’Reilly muito bons, e tenho alguns deles. Este, como o título indica, tem um aspecto bastante prático, e é interessante como lida com vários pontos da linguagem comumente não vistos ao se explicar o paradigma: programação para banco de dados, redes, GUIs, paralelismo e concorrência(algo que aparentemente está em alta para programação funcional atualmente).

No mais, parece bem interessante para ser lido para iniciantes ou para quem deseje melhorar seus conhecimentos práticos sobre Haskell. Mais um livro para o recesso Dezembro – Janeiro!

Página do livro: http://book.realworldhaskell.org/
Encontrado na página inicial de Haskell.

03
Nov
08

Scrum e XP direto das Trincheiras

Este final de semana foi lançado gratuitamente o livro “Scrum e XP direto das Trincheiras”, tradução do livro de Henrik Kniberg, “Scrum and XP from the Trenches”. A tradução foi feita por um grupo de voluntários trabalhando de forma distribuída, com os mais diferentes conhecimentos das línguas, e com o intuito de compartilhar o conhecimento sobre metodologias ágeis ao maior número possível de pessoas.

Scrum e XP direto das trincheiras

Scrum e XP direto das trincheiras


O livro traduzido deve tornar um pouco mais acessível as informações sobre Scrum e XP na língua portuguesa, podendo ser utilizado fácil e gratuitamente por estudantes e curiosos sobre as metodologias. Pode-se obtê-lo pelo link http://www.infoq.com/br/minibooks/scrum-xp-from-the-trenches, bastando apenas o registro na versão brasileira do portal InfoQ Brasil para baixá-lo. Ah, o portal também foi lançado este final de semana, e deve se tornar um bom lugar de troca de experiências entre desenvolvedores no país.




X-Files

 

Novembro 2009
S T Q Q S S D
« Out    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Estatísticas:

  • 3,558 erros de pesquisa

Tweet! :>

last.fm

Join the Free Software Foundation!

Support freedom