13.11.2008

Dojo 53 - map e filter em Haskell

Postado às 09:00 por

  • 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] devolve 6, 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 foldr nã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 coisa diz 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 Char traz funções como isLower
  • otherwise, uma palavra chave, é um alias para True - 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 map e filter
  • 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....