module Aula26 where import Control.Applicative import Aula25 import Aula13 (Talvez (..), safediv) -- importa o tipo Talvez e seus construtores -- instance Applicative [] where -- pure x = [x] -- [] <*> _ = [] -- -- _ <*> [] = [] -- redundante! -- (fun:funs) <*> lista_de_entrs = -- (fmap fun lista_de_entrs) ++ (funs <*> lista_de_entrs) infinitas_funcs :: [Integer -> Integer] infinitas_funcs = [ (n+) | n <- [0..] ] nao_resultados :: [Integer] nao_resultados = infinitas_funcs <*> [] -- loop infinito! resultados :: [Integer] resultados = infinitas_funcs <*> [0, 2, 4] cvf'' :: String -> Integer -> Integer -> OuErro Vaca cvf'' nome idade arrobas = MkVaca <$> (validaNome' nome) <*> (validaIdade' idade) <*> (validaArrobas' arrobas) cvf''' :: String -> Integer -> Integer -> OuErro Integer cvf''' nome idade arrobas = MkVaca <$> (validaNome' nome) <*> (validaIdade' idade) *> (validaArrobas' arrobas) cvf'''' :: String -> Integer -> Integer -> OuErro Integer cvf'''' nome idade arrobas = (validaNome' nome) *> (validaIdade' idade) *> (validaArrobas' arrobas) ---- instance Applicative Talvez where pure = DeFato (<*>) :: Talvez (a -> b) -> Talvez a -> Talvez b Nada <*> _ = Nada _ <*> Nada = Nada (DeFato fun) <*> (DeFato valor) = DeFato (fun valor) instance Alternative Talvez where empty = Nada (<|>) :: Talvez a -> Talvez a -> Talvez a (DeFato x) <|> _ = DeFato x Nada <|> u = u x = (safediv 3 0) <|> (safediv 4 0) y = (safediv 3 0) <|> (safediv 4 1) --- -- [] é Traversable! -- exemplo da comutação de [] com Talvez Integer lista_talvez = [DeFato 3, DeFato 5, DeFato 7] talvez_lista = DeFato [3, 5, 7] lista_talvez' = [DeFato 3, Nada, DeFato 10] talvez_lista' = Nada