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 OuErro type OuErro :: * -> * data OuErro a = Erro String | OK a -- Defined at Aula25.hs:46:1 instance Applicative OuErro -- Defined at Aula25.hs:49:10 instance Eq a => Eq (OuErro a) -- Defined at Aula25.hs:47:13 instance Functor OuErro -- Defined at Aula25.hs:47:23 instance Show a => Show (OuErro a) -- Defined at Aula25.hs:47:17 λ> :i validaNome' validaNome' :: String -> OuErro String -- Defined at Aula25.hs:56:1 λ> :t Erros [] Erros [] :: AcumulaErros a λ> cvf' cvf' :: String -> Integer -> Integer -> OuErro Vaca λ> cvf'' "Malhada" 5 100 Correto (MkVaca {nome = "Malhada", idade = 5, arrobas = 100}) λ> cvf'' "Coalhada" (-5) 100000000 Erros ["minha vo nao gosta desse nome","vaca futura","vaca estrela de neutron"] λ> cvf'' "Coalhada" (5) 100000000 Erros ["minha vo nao gosta desse nome","vaca estrela de neutron"] λ> fmap (+1) $ MkLog (["oii", "td bem"], 10) MkLog (["oii","td bem","fiz um fmap"],11) λ> x MkLog ([],10) λ> y MkLog (["somei 15"],25) λ> z MkLog (["somei 15","somei 77"],102) λ> x MkLog (["Comecei com 10"],10) λ> y MkLog (["Comecei com 10","somei 15"],25) λ> z MkLog (["Comecei com 10","somei 15","somei 77"],102) λ> pos_inicial MkLog (["Comeca em (0,0)"],(0,0)) λ> pos_final MkLog (["Comeca em (0,0)","cima","direita","direita","cima","esquerda"],(1,2)) λ> :t pure pure :: Applicative f => a -> f a λ> :i Monad type Monad :: (* -> *) -> Constraint class Applicative m => Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a {-# MINIMAL (>>=) #-} -- Defined in `GHC.Base' instance Monad m => Monad (WrappedMonad m) -- Defined in `Control.Applicative' instance Monad (Either e) -- Defined in `Data.Either' instance Monad [] -- Defined in `GHC.Base' instance Monad Solo -- Defined in `GHC.Base' instance Monad Maybe -- Defined in `GHC.Base' instance Monad IO -- Defined in `GHC.Base' instance Monad ((->) r) -- Defined in `GHC.Base' instance (Monoid a, Monoid b, Monoid c) => Monad ((,,,) a b c) -- Defined in `GHC.Base' instance (Monoid a, Monoid b) => Monad ((,,) a b) -- Defined in `GHC.Base' instance Monoid a => Monad ((,) a) -- Defined in `GHC.Base' λ> :t (>>=) (>>=) :: Monad m => m a -> (a -> m b) -> m b λ> :t join :1:1-4: error: Variable not in scope: join λ> :t (>=>) :1:1-5: error: * Variable not in scope: >=> * Perhaps you meant one of these: `>>' (imported from Prelude), `>>=' (imported from Prelude), `>=' (imported from Prelude) λ> :t join join :: Monad m => m (m a) -> m a λ> :t (>=>) (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c λ> :i Monad type Monad :: (* -> *) -> Constraint class Applicative m => Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a {-# MINIMAL (>>=) #-} -- Defined in `GHC.Base' instance Monad (Either e) -- Defined in `Data.Either' instance Monad [] -- Defined in `GHC.Base' instance Monad Solo -- Defined in `GHC.Base' instance Monad Maybe -- Defined in `GHC.Base' instance Monad IO -- Defined in `GHC.Base' instance Monad ((->) r) -- Defined in `GHC.Base' instance (Monoid a, Monoid b, Monoid c) => Monad ((,,,) a b c) -- Defined in `GHC.Base' instance (Monoid a, Monoid b) => Monad ((,,) a b) -- Defined in `GHC.Base' instance Monoid a => Monad ((,) a) -- Defined in `GHC.Base' λ> :t concat concat :: Foldable t => t [a] -> [a] λ> join [ [1,2,3], [3,4,5], [], [0,0,0] ] [1,2,3,3,4,5,0,0,0] λ> concat [ [1,2,3], [3,4,5], [], [0,0,0] ] [1,2,3,3,4,5,0,0,0] λ> :t putStrLn putStrLn :: String -> IO () λ> :i () type () :: * data () = () -- Defined in `GHC.Tuple' instance Eq () -- Defined in `GHC.Classes' instance Monoid () -- Defined in `GHC.Base' instance Ord () -- Defined in `GHC.Classes' instance Semigroup () -- Defined in `GHC.Base' instance Enum () -- Defined in `GHC.Enum' instance Show () -- Defined in `GHC.Show' instance Read () -- Defined in `GHC.Read' instance Bounded () -- Defined in `GHC.Enum' λ> :i IO type IO :: * -> * newtype IO a = GHC.Types.IO (GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, a #)) -- Defined in `GHC.Types' instance Applicative IO -- Defined in `GHC.Base' instance Functor IO -- Defined in `GHC.Base' instance Monad IO -- Defined in `GHC.Base' instance MonadPlus IO -- Defined in `GHC.Base' instance Monoid a => Monoid (IO a) -- Defined in `GHC.Base' instance Semigroup a => Semigroup (IO a) -- Defined in `GHC.Base' instance MonadFail IO -- Defined in `Control.Monad.Fail' λ> putStrLn "Hello, World!" Hello, World! λ> getLine Oi, amigo! "Oi, amigo!" λ> :t getLine getLine :: IO String λ> getLine >>= putStrLn ola ola λ> res hahaha hahaha λ> res hehehe hehehe λ> res hihihi hihihi λ>