Ir para o conteúdo
crislanio_macedo

Monads: Operadores >>=, >>, -> : O que é e como usá-los ?

Mensagens Recomendadas

crislanio_macedo    0
crislanio_macedo

Olá a todos, alguém poderia exemplificar os operadores principais que envolvem operações de Monads.

por exemplo:

acumulate2 :: [iO ()] -> IO ()
acumulate2 [] = return ()
acumulate2 (x:xs) = do {
x;
z<-acumulate2 xs;
return z;
--x >> acumulate2 xs;
}

sequencia :: [iO a] -> IO()
sequencia [] =return ()
sequencia (x:xs) = do {
x;
sequencia xs;
}

Aqui em acumulate2 eu tenho uma lista com acções de IO gera a saída, em sequência em tenho uma lista de acções de IO mas não geram saída.

Por exmeplo, como faria isso em o do?

Quero dizer usando combinadores: >>=, >>, -> somente ?

Grato

Editado por crislanio_macedo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
crislanio_macedo    0
crislanio_macedo

Olá a todos, alguém poderia exemplificar os operadores principais que envolvem operações de Monads.

por exemplo:

acumulate2 :: [iO ()] -> IO ()
acumulate2 [] = return ()
acumulate2 (x:xs) = do {
x;
z<-acumulate2 xs;
return z;
--x >> acumulate2 xs;
}

sequencia :: [iO a] -> IO()
sequencia [] =return ()
sequencia (x:xs) = do {
x;
sequencia xs;
}

-- com combinadores:
sequenciaConb :: [iO a] -> IO()
sequenciaConb (x:xs) >>= \c -> if sequenciaConb [] then return () else sequenciaConb >>= (\l return sequenciaConb xs)

Em sequencia ficaria algo assim ?

Prelude> :l monads.hs
[1 of 1] Compiling Main			 ( monads.hs, interpreted )

monads.hs:79:118: parse error on input `)'
Failed, modules loaded: none.


E em accumulate ? ficaria como

Editado por crislanio_macedo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pwseo    223
pwseo

Não percebi bem o que queres fazer. De qualquer modo deixa-me clarificar-te: os operadores monádicos funcionam de forma diferente consoante o monad no qual operam. Neste caso estás a falar do IO, mas há muitos outros monads...

Tenta explicar melhor o que pretendes (dica: experimenta colocar exemplos de output esperado)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
crislanio_macedo    0
crislanio_macedo

Não percebi bem o que queres fazer. De qualquer modo deixa-me clarificar-te: os operadores monádicos funcionam de forma diferente consoante o monad no qual operam. Neste caso estás a falar do IO, mas há muitos outros monads...

Tenta explicar melhor o que pretendes (dica: experimenta colocar exemplos de output esperado)

No caso eu queria converter as funções, sequencia e accumulate, sem usar a notação do.

Outro caso por exemplo seria também: Como fazer uma função (versão de putStrLn::OI) usando map, putChar e a sequencia ja definida acima ?

sequenciaMap [] =return []
sequenciaMap (x:xs) = do {
y<-x;
z<-sequenciaMap xs;
return (y:z)
}

*Main> let a =sequenciaMap [putChar,putChar]
*Main> a

:106:1:
No instance for (Show (Char -> [iO ()]))
arising from a use of `print'
Possible fix:
add an instance declaration for (Show (Char -> [iO ()]))
In a stmt of an interactive GHCi command: print it
*Main>

Editado por crislanio_macedo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.