module Aula27 where import GHC.Base (liftA2) import Aula7 (Talvez (..)) import Aula10 (Lista (..)) -- (..) importa os construtores "desqualificados", -- sem o nome do módulo carregado na frente -- definindo liftA2 de (<*>) meuLiftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c meuLiftA2 fun xa xb = (fmap fun xa) <*> xb -- alternativa -- meuLiftA2 fun xa xb = fun <$> xa <*> xb -- alternativa -- meuLiftA2 fun xa = (fmap fun xa) <*> -- alternativa -- meuLiftA2 fun = (<*>) . fmap fun -- alternativa ???? -- meuLiftA2 = (.) (.) (.) (<*>) fmap -- "meuApply" (<**>) :: Applicative f => f (a -> b) -> f a -> f b (<**>) = liftA2 ($) -- Definindo instâncias de Applicative instance Applicative Talvez where pure x = DeFato x -- alternativa -- pure = DeFato (DeFato f) <*> Nada = Nada (DeFato f) <*> DeFato x = DeFato (f x) -- alternativa -- (DeFato f) <*> x = fmap f x -- ou -- DeFato f <*> = fmap f Nada <*> _ = Nada -- desvio a toa prox (a,b) | b == 0 = (0, a+1) | a < b = (a+1, b) | otherwise = (a, b-1) pares :: [(Int,Int)] pares = (0,0) : fmap prox pares naturais :: [Int] naturais = [0..] funcs :: [Int -> Int] funcs = [(*i) | i <- [0..]] -- instance Applicative Lista where