Aula 10
1 Por que monadas?
- https://wiki.haskell.org/All_About_Monads
- livro texto capítulos 12 e 13
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