Jump to content
crislanio_macedo

Erro: getElts :: [Int] -> [a] -> Maybe [a], recebe uma lista de indices e uma lista e retorna uma lista Maybe[a] dos elems

Recommended Posts

crislanio_macedo

Erro: getElts :: [int] -> [a] -> Maybe [a], recebe uma lista de indices e uma lista e retorna uma lista Maybe[a] dos elementos:

Segue o código até onde eu fiz,


getElts :: [int] -> [a] -> Maybe [a]
getElts [] (x:xs) = return []
getElts (y:ys) xs = do {
elem1 <- (?!) xs y;
elem2 <- getElts ys xs;
return (elem1:elem2);
}

(!?) :: [a]-> Int -> Maybe a
(!?) xs i | i < 0 = Nothing
(!?) [] _ = Nothing
(!?) (x:_) 0 = Just x
(!?) (_:xs) i = xs !? (i-1)

contudo não sei se minha ideia para retornar uma lista com os indices ditos na lista de indices está correta.

Erro:


teste.hs:126:18:
Not in scope: `?!'
Perhaps you meant one of these:
`$!' (imported from Prelude), `!!' (imported from Prelude),
`!?' (line 79)
Failed, modules loaded: none.

Me ajudem, Att.

Edited by crislanio_macedo

Share this post


Link to post
Share on other sites
thoga31

Uma sugestão muito simples: lê o erro e interpreta o que ele quer dizer. É inglês puro. Caso não entendas bem inglês, deixo-te a tradução:

teste.hs:126:18:
Não existe no scope: `?!'
Talvez quis dizer um dos seguintes:
`$!' (importado do Prelude), `!!' (importado do Prelude),
`!?' (linha 79)
Falhou, módulos carregados: nenhum.

Eu já disse, em ocasiões anteriores, que o compilador não dá mensagens ao acaso. Ele "fala", e "fala" muito bem.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
crislanio_macedo

Uma sugestão muito simples: lê o erro e interpreta o que ele quer dizer. É inglês puro. Caso não entendas bem inglês, deixo-te a tradução:

teste.hs:126:18:
Não existe no scope: `?!'
Talvez quis dizer um dos seguintes:
`$!' (importado do Prelude), `!!' (importado do Prelude),
`!?' (linha 79)
Falhou, módulos carregados: nenhum.

Eu já disse, em ocasiões anteriores, que o compilador não dá mensagens ao acaso. Ele "fala", e "fala" muito bem.

Eu entendo o ingles sim, e li a mensagem apesar de mesmo assim não me dedicar a investigar quais motivos levaram a tal erro, o erro decorre da função (!?) contudo já foi corrigido, mas nessa questão ainda persiste o erro, mesmo se por acaso coloque (!!), não têm o tipo Maybe e dará erro também.

Edited by crislanio_macedo

Share this post


Link to post
Share on other sites
thoga31

Se mudaste o ?! pelo operador correcto !?, então o erro tem de ser diferente. Sendo um erro diferente, convém que o mostres para podermos analisar o código conforme.

Se o erro é igual, é porque 1) não guardaste as alterações do ficheiro ou 2) tens o operador errado noutro local.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
crislanio_macedo

O meu erro, não sei por que grande descuido foi colocar (?!) ao invês de (!?), corrigi já.

getElts :: [int] -> [a] -> Maybe [a]
getElts (x:xs) [] = return []
getElts [] (x:xs) = return []
getElts (y:ys) xs = do {
elem1 <- (!?) xs y;
elem2 <- getElts ys xs;
return (elem1:elem2);
}

(!?) :: [a]-> Int -> Maybe a
(!?) xs i | i < 0 = Nothing
(!?) [] _ = Nothing
(!?) (x:_) 0 = Just x
(!?) (_:xs) i = Just ((!!) xs (i-1))

(!??) [] n = Nothing
(!??) xs n
   | (length xs) < n = Nothing
   | otherwise = Just( (!!) xs n)

Grato, caso possa pediria para que olhasse a questão da rotina postada a pouco, estou a ter problemas nela, e já gastei um bom tempo nela sem sucesso,

Att

Edited by crislanio_macedo

Share this post


Link to post
Share on other sites
thoga31

caso possa pediria para que olhasse a questão da rotina postada a pouco, estou a ter problemas nela, e já gastei um bom tempo nela sem sucesso,

Ainda bem que pude ajudar, mas eu ajudo nos tópicos onde posso ajudar, quando posso ajudar. ;)

Não sou um mestre de Haskell, antes pelo contrário - pouco sei para além do básico.


Knowledge is free!

Share this post


Link to post
Share on other sites
pwseo

crislanio_macedo,

Qualquer coisa está a fazer pouco sentido no enunciado. Não me parece lógico que getElts tenha como resultado o tipo de dados Maybe [a], especialmente por teres dito que «retorna uma lista Maybe[a]», ou seja, o resultado será Nothing ou uma lista de elementos -- e é isto que não faz sentido, pois é perfeitamente possível representar a ausência de valores numa lista com [], sem recorrer ao Nothing.

O enunciado é mesmo assim? No enunciado está mesmo essa assinatura da função?

Se calhar, o pretendido é que a tua função tenha um comportamento semelhante ao seguinte:

*Main> getElts [1,2,10] "Pedro"
[Just 'e', Just 'd', Nothing]

Aguardo a tua resposta para prosseguirmos

Share this post


Link to post
Share on other sites
crislanio_macedo


getElts :: [int] -> [a] -> Maybe [a]
getElts (x:xs) [] = return []
getElts [] (x:xs) = return []
getElts (y:ys) xs = do {
elem1 <- (!?) xs y;
elem2 <- getElts ys xs;
return (elem1:elem2);
}

O caso é que o tanto faz eu fazer return [] ou Maybe , é isso.

E em questão o (!?) retorna Maybe.

*Main> getElts [1,2,3] [10,20,30,40]

Just [20,30,40]

Retorna os índices do elemento de uma lista. Para se ter esse comportamento seria o caso de se ter a função forM1 não ?

forM1 :: Monad m => [t] -> (t -> m a) -> m [a]
forM1 [] f = return []
forM1 (x:xs) f= do {
a<- f x;
b<- forM1 xs f;
return (a:b);
}
--
*Main> forM1 [1,2,3] print
1
2
3
[(),(),()]

Edited by crislanio_macedo

Share this post


Link to post
Share on other sites
pwseo

A função (!?) devolve um Maybe a porque faz todo o sentido que o faça, uma vez que é a maneira de garantir que não há erros durante a execução (como aconteceria se tentasses aceder ao 10º elemento de uma lista com 5 elementos).

Quanto à getElts, é completamente diferente devolver [Maybe a] ou Maybe [a] -- a primeira opção faz todo o sentido, a segunda não (pelo menos no contexto daquele que parece ser o teu problema).

Mais uma vez, pergunto-te: tens a certeza que é suposto a getElts ter essa assinatura?

-- o que tu tens
getElts :: [int] -> [a] -> Maybe [a]

-- o que eu acho que deveria ser
getElts :: [int] -> [a] -> [Maybe a]

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.