13.11.2008
Dojo 53 - map e filter em Haskell
- Data: 29/09/2008
- Participantes: Hugo, R, João, Mari, Thiago, Yoshi, Breno
- Problema: map, filter e foldr em Haskell com HUnit (cuidado! Links da Wikipedia mostram implementação!)
- Código: http://github.com/dojosp/participant-s-projects/tree/master/53-haskell-basico
Decidimos finalmente tentar implementar as clássicas funções map, filter e foldr em Haskell. Cada uma deve fazer o seguinte:
- map: recebe como parâmetros uma função unária (apenas um parâmetro) e uma lista, e devolve uma lista que é resultado de aplicar a função a cada elemento da lista passada como parâmetro. Por exemplo:
map (+ 5) [2 0 4]devolve[7 5 9] - filter: recebe como parâmetros um predicado (função unária que devolve True ou False) e uma lista, e devolve uma lista com os elementos da lista original que satisfazem o predicado (resposta True). Por exemplo:
filter even [1 2 3 6 5]devolve[2 6] - foldr: essa é mais complicadinha, e nem começamos a fazê-la, então nem vou explicar muito =P. Começando com um exemplo:
foldr (+) 0 [1 2 3]devolve6, que é a soma dos elementos da lista. Então, o foldr recebe uma fuinção binária (com dois parâmetros), um elemento "base" (0 no exemplo) e uma lista, e devolve o resultado de usar a função para "juntar" todos os elementos da lista.
Codando
Começamos pelo map que parecia mais fácil. O código cresceu num ritmo acelerado e bom (ou seja todos estavam acompanhando). Apesar de algumas dificuldades com as mensagens de erro, conseguimos contorná-las e terminar o map.
Em seguida atacamos o filter, no mesmo ritmo. Terminamos de implementar no horário, e decidimos não começar o foldr. :-)
Retrospectiva
Reclamamos:
- Dos atrasos
- De não filmar a sessão (para quem quer conhecer)
- De não conseguirmos fazer commit no repositório remoto durante a reunião (o git estava dando um erro bizarro que ninguém conhecia)
- De erros do compilador Haskell que não entendemos (fomos forçados a declarar o tipo das funções para contorná-los)
- De problemas com o editor
E mais:
- O
foldrnão parece tão fácil quanto os outros - Queremos aprender a implementação do
even(verifica se um número é par) - Queremos entender a diferença entre
~=?e==
Por outro lado, aprendemos:
:t coisadiz o tipo de coisa (no interpretador)- a definir tipo de funções que recebem funções como parâmetro
- currying, ou seja, funções parciais "automáticas"
- o que é pattern matching e pattern overlapping
import Chartraz funções comoisLowerotherwise, uma palavra chave, é um alias paraTrue- para alguns isso cheira a hack, para outros é açúcar sintático :-P
Além disso, gostamos:
- que Haskell continua legal e está mais intuitivo
- que tivemos pessoas novas
- que terminamos
mapefilter - que tivemos um ritmo bom e acelerado
No parking lot, discutimos os temas:
- Não explicamos dojo pro novato
- Pq precisamos indicar os tipos? (o que são os erros bizarros?)
- O que é "Char.isLower" ? Método? Tem algo a ver com P.O.O.?
- O main é uma função??
ps: Buscando links pra colocar neste artigo, descobri que existiu um cara chamado Haskell Curry, matemático e lógico norte-americano....