Aula 9
livro texto (cap 11 e 9)
Haskell online outro - so compilado
1 Maybe
data Maybe a = Nothing | Just a
Resultado de algumas funções que podem não ter resultado
:m + Data.List find (>4) [1,2,3,4,5,6,7] find (>14) [1,2,3,4,5,6,7]
import Data.Map.Strict as M let dd = M.fromList [("a",3),("b",5),("g",8)] M.lookup "b" dd M.lookup "f" dd
1.1 Funções do Maybe
1.2 Maybe como container
O Just a
é o "valor correto" e Nothing
é o valor errado. Eu
gostaria de poder continuar processando um Maybe enquanto o valor esta
"correto"
fmap (*5) (Just 6) fmap (*5) Nothing
1.2.1 Functor
Um container é um functor
se ele implementa a função fmap
:t fmap :t map
fmap é muito parecido com o map, ou na verdade o container lista é um functor!!
O fmap aplica uma função que funciona no tipo de dentro para dentro do container
Eu gostaria que:
(Just 7) + (Just 3) ==> Just 10 (Just 7) + Nothing ==> Nothing
1.2.2 applicative
Um container é um applicative
se ele permite jogar uma função
binaria que funciona no tipo interno para dentro do container
(+) <$> (Just 7) <*> (Just 3) (+) <$> (Just 7) <*> Nothing
1.2.3 monad
Um container é uma monad
se ele implementa (entre outras coisas) a
função infixa >>= que remove o dado de um container para aplica-lo a
uma função que esta esperando o tipo interno
:t (>>+) (Just 8) >>= (\x -> if odd x then Nothing else (Just (2*x+1)) )
Monad também a função return
que coloca um valor dentro do container
2 I/O
Toda I/O esta dentro de uma monada IO
:t getLine :t putStrLn
- getLine le uma linha e retorna o string dentro da monada IO
- putStrLn recebe um string, imprime ele, e retorna uma tupla vazia dentro de IO
main = do dados <- getLine let saida = proc dados putStrLn saida
- getContents le tudo
- print converte argumentos para string e imprime
- Int= para converter um sting para inteiros
- Float= para converter p/ float
- funções
lines
para quebrar um string em linhas ewords
para quebrar uma linha nos brancos - funçoes
unlines
eunwords
para montar o string final