Aula 10

1 Por que monadas?

1.1 Logging

data Log a = Log a String

f :: a -> Log a
f x = Log (sin x) "Tirei o seno"

Log é uma monada

return a = Log a ""
Log a s >>= f = let 
                Log val ss = f a
                in Log val s++ss

Logging é um tipo particular da monada Writer.

Nos dois texto acima eles não usam o data mas o type e o newtype que não vimos.

1.2 Estado

data Estado val estada = Estado val estado

random ::  S -> Estado b S 

-- o que precisa ser feito
random3 gen = let 
           Estado n1 gen1 = random gen 
           Estado n2 gen2 = random gen1
           Estado n3 gen3 = random gen 2
         in Estado (n1,n2,n3) gen3

Estado v s >>= f = Estado newv news = f s
 
- com monadas
random3 = do
          n1 <- random
          n2 <- random
          n3 <- random
          return (n1,n2,n3)

Isso é no caminho da monada State, mas State é mais complicado.

2 Teste

leia um texto (multiplas linhas) do standard input e imprima o número de palavras distintas no texto

  • letras maiusculas e minusculas são irrelevantes (Casa e cAsa são a mesma palavra
  • palavras são sequencias de letras (sem dígitos ou pontuação)
  • palavras estão entre brancos, mudança de linha, ou caracteres de pontuação
  • pontuação: ".;;:"

Voce pode e deve usar os pacotes da biblioteca padrão do Haskell! Em particular Data.Char, Data.List e possivelmente Data.Set