module Aula28 where import Aula7 (Talvez (..)) import Aula27 import GHC.Base (liftA2) data UmOuOutro a b = Erro a | Sucesso b deriving (Eq, Show) instance Functor (UmOuOutro a) where fmap f (Erro x) = Erro x fmap f (Sucesso x) = Sucesso (f x) instance Applicative (UmOuOutro a) where pure x = Sucesso x -- (Erro err) <*> _ = Erro err e@(Erro _) <*> _ = e _ <*> (Erro x) = Erro x (Sucesso f) <*> (Sucesso x) = Sucesso (f x) data Vaca = Vaca {nome :: String, peso :: Integer} deriving (Show, Eq) validaNome :: String -> Talvez String validaNome "" = Nada validaNome x = DeFato x validaPeso :: Integer -> Talvez Integer validaPeso p | p <= 0 = Nada | p > 0 = DeFato p constroiVaca' :: String -> Integer -> Talvez Vaca constroiVaca' nome peso = case validaNome nome of Nada -> Nada DeFato nomeok -> case validaPeso peso of Nada -> Nada DeFato pesook -> DeFato (Vaca nomeok pesook) -- eca! constroiVaca :: String -> Integer -> Talvez Vaca constroiVaca nome peso = pure Vaca <*> (validaNome nome) <*> (validaPeso peso) -- constroiVaca nome peso = Vaca <$> (validaNome nome) <*> (validaPeso peso) -- constroiVaca nome peso = (liftA2 Vaca) (validaNome nome) (validaPeso peso) data Vaca2 = Vaca2 {nome2 :: String, peso2 :: Integer, temChifre :: Bool} deriving (Show, Eq) validaChifre :: Bool -> Talvez Bool validaChifre False = Nada validaChifre _ = DeFato True constroiVacaChifruda :: String -> Integer -> Bool -> Talvez Vaca2 constroiVacaChifruda n p c = pure Vaca2 <*> validaNome n <*> validaPeso p <*> validaChifre c