The next big Haskell project is about to start! If I break, you can: 1. Restart: M-x haskell-process-restart 2. Configure logging: C-h v haskell-process-log (useful for debugging) 3. General config: M-x customize-mode 4. Hide these tips: C-h v haskell-process-show-debug-tips Changed directory: /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/ λ> :i Functor type Functor :: (* -> *) -> Constraint class Functor f where fmap :: (a -> b) -> f a -> f b (<$) :: a -> f b -> f a {-# MINIMAL fmap #-} -- Defined in `GHC.Base' instance Functor (Either a) -- Defined in `Data.Either' instance Functor [] -- Defined in `GHC.Base' instance Functor Solo -- Defined in `GHC.Base' instance Functor Maybe -- Defined in `GHC.Base' instance Functor IO -- Defined in `GHC.Base' instance Functor ((->) r) -- Defined in `GHC.Base' instance Functor ((,,,) a b c) -- Defined in `GHC.Base' instance Functor ((,,) a b) -- Defined in `GHC.Base' instance Functor ((,) a) -- Defined in `GHC.Base' λ> :i Maybe type Maybe :: * -> * data Maybe a = Nothing | Just a -- Defined in `GHC.Maybe' instance Applicative Maybe -- Defined in `GHC.Base' instance Eq a => Eq (Maybe a) -- Defined in `GHC.Maybe' instance Functor Maybe -- Defined in `GHC.Base' instance Monad Maybe -- Defined in `GHC.Base' instance Semigroup a => Monoid (Maybe a) -- Defined in `GHC.Base' instance Ord a => Ord (Maybe a) -- Defined in `GHC.Maybe' instance Semigroup a => Semigroup (Maybe a) -- Defined in `GHC.Base' instance Show a => Show (Maybe a) -- Defined in `GHC.Show' instance MonadFail Maybe -- Defined in `Control.Monad.Fail' instance Read a => Read (Maybe a) -- Defined in `GHC.Read' instance Foldable Maybe -- Defined in `Data.Foldable' instance Traversable Maybe -- Defined in `Data.Traversable' λ> :i Maybe type Maybe :: * -> * data Maybe a = Nothing | Just a -- Defined in `GHC.Maybe' instance Applicative Maybe -- Defined in `GHC.Base' instance Eq a => Eq (Maybe a) -- Defined in `GHC.Maybe' instance Functor Maybe -- Defined in `GHC.Base' instance Monad Maybe -- Defined in `GHC.Base' instance Semigroup a => Monoid (Maybe a) -- Defined in `GHC.Base' instance Ord a => Ord (Maybe a) -- Defined in `GHC.Maybe' instance Semigroup a => Semigroup (Maybe a) -- Defined in `GHC.Base' instance Show a => Show (Maybe a) -- Defined in `GHC.Show' instance MonadFail Maybe -- Defined in `Control.Monad.Fail' instance Read a => Read (Maybe a) -- Defined in `GHC.Read' instance Foldable Maybe -- Defined in `Data.Foldable' instance Traversable Maybe -- Defined in `Data.Traversable' λ> :i Functor type Functor :: (* -> *) -> Constraint class Functor f where fmap :: (a -> b) -> f a -> f b (<$) :: a -> f b -> f a {-# MINIMAL fmap #-} -- Defined in `GHC.Base' instance Functor (Either a) -- Defined in `Data.Either' instance Functor [] -- Defined in `GHC.Base' instance Functor Solo -- Defined in `GHC.Base' instance Functor Maybe -- Defined in `GHC.Base' instance Functor IO -- Defined in `GHC.Base' instance Functor ((->) r) -- Defined in `GHC.Base' instance Functor ((,,,) a b c) -- Defined in `GHC.Base' instance Functor ((,,) a b) -- Defined in `GHC.Base' instance Functor ((,) a) -- Defined in `GHC.Base' λ> x = Just 15 λ> (+5) x :14:1-6: error: * No instance for (Num (Maybe Integer)) arising from a use of `it' * In the first argument of `print', namely `it' In a stmt of an interactive GHCi command: print it λ> fmap (+5) x Just 20 λ> (+5) <$> x Just 20 λ> :t <$> :1:1-3: error: parse error on input `<$>' λ> :t (<$>) (<$>) :: Functor f => (a -> b) -> f a -> f b λ> :i (<$>) (<$>) :: Functor f => (a -> b) -> f a -> f b -- Defined in `Data.Functor' infixl 4 <$> λ> :i (4) :1:2: error: parse error on input `4' λ> :i ($) ($) :: (a -> b) -> a -> b -- Defined in `GHC.Base' infixr 0 $ λ> :i (+) type Num :: * -> Constraint class Num a where (+) :: a -> a -> a ... -- Defined in `GHC.Num' infixl 6 + λ> :t fmap (+5) fmap (+5) :: (Functor f, Num b) => f b -> f b λ> :t fmap (+) fmap (+) :: (Functor f, Num a) => f a -> f (a -> a) λ> (+) <$> x (+) <$> x :: Num a => Maybe (a -> a) λ> y = Just 109 λ> x Just 15 λ> :i Applicative type Applicative :: (* -> *) -> Constraint class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b GHC.Base.liftA2 :: (a -> b -> c) -> f a -> f b -> f c (*>) :: f a -> f b -> f b (<*) :: f a -> f b -> f a {-# MINIMAL pure, ((<*>) | liftA2) #-} -- Defined in `GHC.Base' instance Applicative (Either e) -- Defined in `Data.Either' instance Applicative [] -- Defined in `GHC.Base' instance Applicative Solo -- Defined in `GHC.Base' instance Applicative Maybe -- Defined in `GHC.Base' instance Applicative IO -- Defined in `GHC.Base' instance Applicative ((->) r) -- Defined in `GHC.Base' instance (Monoid a, Monoid b, Monoid c) => Applicative ((,,,) a b c) -- Defined in `GHC.Base' instance (Monoid a, Monoid b) => Applicative ((,,) a b) -- Defined in `GHC.Base' instance Monoid a => Applicative ((,) a) -- Defined in `GHC.Base' λ> :i fmap type Functor :: (* -> *) -> Constraint class Functor f where fmap :: (a -> b) -> f a -> f b ... -- Defined in `GHC.Base' λ> :i MyApplicative type MyApplicative :: (* -> *) -> Constraint class MyApplicative f where mypure :: a -> f a myapply :: f (a -> b) -> f a -> f b myliftA2 :: (a -> b -> c) -> f a -> f b -> f c {-# MINIMAL mypure, myapply, myliftA2 #-} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:6:1 λ> :t ($) ($) :: (a -> b) -> a -> b λ> :t (<*>) (<*>) :: Applicative f => f (a -> b) -> f a -> f b λ> :t ($) ($) :: (a -> b) -> a -> b λ> :t liftA2 :1:1-6: error: * Variable not in scope: liftA2 * Perhaps you meant `myliftA2' (line 9) λ> :t liftA2 liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c λ> :i MyApplicative type MyApplicative :: (* -> *) -> Constraint class Functor f => MyApplicative f where mypure :: a -> f a myapply :: f (a -> b) -> f a -> f b myliftA2 :: (a -> b -> c) -> f a -> f b -> f c {-# MINIMAL mypure #-} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:8:1 λ> :i Applicative type Applicative :: (* -> *) -> Constraint class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b liftA2 :: (a -> b -> c) -> f a -> f b -> f c (*>) :: f a -> f b -> f b (<*) :: f a -> f b -> f a {-# MINIMAL pure, ((<*>) | liftA2) #-} -- Defined in `GHC.Base' instance Applicative (Either e) -- Defined in `Data.Either' instance Applicative [] -- Defined in `GHC.Base' instance Applicative Solo -- Defined in `GHC.Base' instance Applicative NonEmpty -- Defined in `GHC.Base' instance Applicative Maybe -- Defined in `GHC.Base' instance Applicative IO -- Defined in `GHC.Base' instance Applicative ((->) r) -- Defined in `GHC.Base' instance (Monoid a, Monoid b, Monoid c) => Applicative ((,,,) a b c) -- Defined in `GHC.Base' instance (Monoid a, Monoid b) => Applicative ((,,) a b) -- Defined in `GHC.Base' instance Monoid a => Applicative ((,) a) -- Defined in `GHC.Base' λ> :i MyApplicative type MyApplicative :: (* -> *) -> Constraint class Functor f => MyApplicative f where mypure :: a -> f a myapply :: f (a -> b) -> f a -> f b myliftA2 :: (a -> b -> c) -> f a -> f b -> f c {-# MINIMAL mypure, myliftA2 #-} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:8:1 λ> :i MyApplicative type MyApplicative :: (* -> *) -> Constraint class Functor f => MyApplicative f where mypure :: a -> f a myapply :: f (a -> b) -> f a -> f b myliftA2 :: (a -> b -> c) -> f a -> f b -> f c {-# MINIMAL mypure, myapply #-} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:8:1 λ> :i MyApplicative type MyApplicative :: (* -> *) -> Constraint class Functor f => MyApplicative f where mypure :: a -> f a myapply :: f (a -> b) -> f a -> f b myliftA2 :: (a -> b -> c) -> f a -> f b -> f c {-# MINIMAL mypure #-} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:8:1 λ> :i MyApplicative type MyApplicative :: (* -> *) -> Constraint class Functor f => MyApplicative f where mypure :: a -> f a myapply :: f (a -> b) -> f a -> f b myliftA2 :: (a -> b -> c) -> f a -> f b -> f c {-# MINIMAL mypure, (myapply | myliftA2) #-} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:8:1 λ> validaNome "Malhada" Just "Malhada" λ> validaNome "Coalhada" Nothing λ> validaIdade (-20) Nothing λ> validaIdade (155) Just 155 λ> validaArrobas 353453 Nothing λ> :i Maybe type Maybe :: * -> * data Maybe a = Nothing | Just a -- Defined in `GHC.Maybe' instance Alternative Maybe -- Defined in `GHC.Base' instance Applicative Maybe -- Defined in `GHC.Base' instance Eq a => Eq (Maybe a) -- Defined in `GHC.Maybe' instance Functor Maybe -- Defined in `GHC.Base' instance Monad Maybe -- Defined in `GHC.Base' instance MonadPlus Maybe -- Defined in `GHC.Base' instance Semigroup a => Monoid (Maybe a) -- Defined in `GHC.Base' instance Ord a => Ord (Maybe a) -- Defined in `GHC.Maybe' instance Semigroup a => Semigroup (Maybe a) -- Defined in `GHC.Base' instance Show a => Show (Maybe a) -- Defined in `GHC.Show' instance MonadFail Maybe -- Defined in `Control.Monad.Fail' instance Read a => Read (Maybe a) -- Defined in `GHC.Read' instance Foldable Maybe -- Defined in `Data.Foldable' instance Traversable Maybe -- Defined in `Data.Traversable' λ> :i Vaca type Vaca :: * data Vaca = MkVaca {nome :: String, idade :: Integer, arrobas :: Integer} -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:23:1 instance Eq Vaca -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:24:13 instance Show Vaca -- Defined at /home/hugo/Academic/Teaching/_Atual/TCPF/Aulas/Aula25.hs:24:17 λ> :t MkVaca MkVaca :: String -> Integer -> Integer -> Vaca λ> liftA3 liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d λ> liftA3 MkVaca liftA3 MkVaca :: Applicative f => f String -> f Integer -> f Integer -> f Vaca λ> cvf "Malhada" 15 100 Just (MkVaca {nome = "Malhada", idade = 15, arrobas = 100}) λ> cvf "Malhada" 300 100 Nothing λ> cvf "Coalhada" 30 100 Nothing λ> cvf "Coalhada" 30 1002342 Nothing λ> cvf' "Coalhada" 30 1002342 Erro "minha v\243 n\227o gosta desse nome" λ> cvf' "Coalhada" 30 1002342 Erro "minha vo n\227o gosta desse nome" λ> cvf' "Coalhada" 30 1002342 Erro "minha vo nao gosta desse nome" λ> cvf' "Malhada" 30 1002342 Erro "vaca estrela de neutron" λ> cvf' "Malhada" 30234 1002342 Erro "vaca medieval" λ> cvf' "Malhada" 30 10 OK (MkVaca {nome = "Malhada", idade = 30, arrobas = 10}) λ> f <$> x <*> y <*> z