sexta-feira, 3 de julho de 2009

Haskell, as mônadas e o ICFP

Mônadas (monads em inglês) são o ponto alto da programação funcional. Em Haskell, uma linguagem que se proclama puramente funcional, elas são a saída honrosa para os efeitos colaterais inexoráveis, também conhecidos como E/S.

Segundo Simon Peyton-Jones, um dos pais do Haskell, um programa puramente funcional é como uma caixa fechada. Não temos como saber se ela está funcionando, pois nem esquenta. O E/S é fundamental, mas quebra o conceito da pureza, por alterar "todo o universo" cada vez que ocorre. Para isolar os efeitos colaterais do corpo da linguagem, os criadores do Haskell utilizaram o conceito das mônadas. O grande problema surge então quando vamos tentar entendê-las: mônadas são entes matemáticos oriundos da teoria das categorias, um ramo tresloucado da álgebra abstrata. É uma piada recorrente dizer que o rito de iniciação do neófito em Haskell é escrever um tutorial sobre mônadas!

Após ler cerca de uma dúzia de tutoriais, que incluem desde o mais mão-na-massa a um tutorial sobre teoria das categorias, não consegui, de forma alguma, entender como essas mônadas poderiam me ajudar em alguma coisa. Para piorar, por ser uma linguagem com avaliação tardia, toda ação que exigia sequência se tornava tediosamente complexa. No concurso do ICFP 2009, finalmente entendi uma frase famosa de Simon Peyton Jones: "O grande erro foi usarmos o nome mônadas. Deveríamos ter chamado de 'coisas fofinhas' (warm, fuzzy things, no original)".

Na verdade, toda a teoria das categorias serve apenas para explicar por que as mônadas funcionam. O programador que vai criar uma mônada precisa de um conhecimento mínimo sobre elas, e o programador que vai usar precisa saber apenas como as funções expostas para a mônada interagem com ela, ignorando o funcionamento interno. Com este ponto de vista, o mais importante é entender o funcionamento do operador (>>=), que, inclusive, é a logomarca atual do Haskell.

Nas próximas postagens, vou colocar exemplos retirados do código que estou escrevendo para solução do problema do ICFP 2009, procurando demonstrar esta minha tese.

Alias, talvez até possamos considerar isto um tutorial de mônadas. Aí, quem sabe, deixo de ser um neófito!

2 comentários:

Roberto disse...

Você esqueceu de mencionar (explicitamente, pelo menos) que as mônadas também são usadas quando a "ordem de execução" precisa ser controlada, mesmo sem E/S. Claro, normalmente isso só é importante quando há interação com o "mundo exterior", mas não sei se, para um leitor leigo, isso fica claro.

Seus posts, junto com o notável avanço do principal compilador do Haskell (GHC) em termos de performance, me convenceram a dar uma "reolhada" na linguagem.

Rafael Gustavo disse...

Sim, é fato! E uma das partes mais complicadas da teoria sobre as monadas é justamente a que demonstra que, mesmo com avaliação tardia, a execução de uma monada só pode ocorrer em sequência!

Postagens populares