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