crislanio_macedo Posted March 8, 2015 at 11:45 PM Report Share #578990 Posted March 8, 2015 at 11:45 PM (edited) Pessoal estou a ter um erro ao tentar fazer a função replicate, alguém poderia me ajudar. dMod x = (x `mod` 10) dDiv x =(x `div` 10) inteiroPraLista :: Int -> [int] inteiroPraLista x | x<10 = [x] -- error "Entrada invalida" |otherwise= if (dDiv x) >10 then (dMod x):inteiroPraLista (dDiv(x)) else dMod(x):[dDiv (x) ] listaPraInteiro:: [int]->Int listaPraInteiro [] = 0 listaPraInteiro (x:xs) = 10 * listaPraInteiro (xs) + x rev x = listaPraInteiro (inteiroPraLista x) replica c 0 = [] replica c a | c<0 =error "Numero Negativo!" | otherwise = replica (c-1) rev a Erro. Prelude> :l Exercicios-2Entrega.hs [1 of 1] Compiling Main ( Exercicios-2Entrega.hs, interpreted ) Exercicios-2Entrega.hs:43:24: Couldn't match expected type `(Int -> Int) -> [a0]' with actual type `[a0]' The function `replica' is applied to three arguments, but its type `a1 -> (Int -> Int) -> [a0]' has only two In the exp<b></b>ression: replica (c - 1) rev a In an equation for `replica': replica c a | c < 0 = error "Numero Negativo!" | otherwise = replica (c - 1) rev a Failed, modules loaded: none. Edited March 8, 2015 at 11:51 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
thoga31 Posted March 9, 2015 at 12:00 AM Report Share #578992 Posted March 9, 2015 at 12:00 AM O meu primeiro conselho é ler atentamente o que o GHC nos está a tentar dizer. Ele escreve muita coisa, mas não é um discurso político - é informação extremamente útil. O essencial para entendermos este caso é isto: The function `replica' is applied to three arguments, but its type `a1 -> (Int -> Int) -> [a0]' has only two In the exp<b></b>ression: replica (c - 1) rev a Vamos "traduzir": o GHC informa-nos que estamos a dar três argumentos à função replica na expressão replica (c-1) rev a quando esta só pode ter dois argumentos. Analisando o código... replica (c - 1) rev a -- ^ ^ ^ -- | | | -- | | | -- 1 2 3 Eis os três argumentos. Uma vez que o segundo argumento de replica é o resultado de uma função, rev a, convém indicar isso mesmo ao GHC com o uso correcto de parêntesis ou do operador $. replica (c - 1) $ rev a -- ou replica (c - 1) (rev a) 1 Report Knowledge is free! Link to comment Share on other sites More sharing options...
crislanio_macedo Posted March 9, 2015 at 12:24 AM Author Report Share #578993 Posted March 9, 2015 at 12:24 AM (edited) O meu primeiro conselho é ler atentamente o que o GHC nos está a tentar dizer. Ele escreve muita coisa, mas não é um discurso político - é informação extremamente útil. O essencial para entendermos este caso é isto: The function `replica' is applied to three arguments, but its type `a1 -> (Int -> Int) -> [a0]' has only two In the exp<b></b>ression: replica (c - 1) rev a Vamos "traduzir": o GHC informa-nos que estamos a dar três argumentos à função replica na expressão replica (c-1) rev a quando esta só pode ter dois argumentos. Analisando o código... replica (c - 1) rev a -- ^ ^ ^ -- | | | -- | | | -- 1 2 3 Eis os três argumentos. Uma vez que o segundo argumento de replica é o resultado de uma função, rev a, convém indicar isso mesmo ao GHC com o uso correcto de parêntesis ou do operador $. replica (c - 1) $ rev a -- ou replica (c - 1) (rev a) Fiz isso mas não estou tendo o resultado esperado. *Main> replica 2 3 *** Exception: Numero Negativo! *Main> replica 3 1 *** Exception: Numero Negativo! replica c 0 = [] replica c a | c<0 =error "Numero Negativo!" | otherwise = replica (c-1) $ rev a Edited March 9, 2015 at 03:04 AM by thoga31 Correcção do quote + GeSHi Link to comment Share on other sites More sharing options...
thoga31 Posted March 9, 2015 at 03:05 AM Report Share #578997 Posted March 9, 2015 at 03:05 AM Eu não estive a analisar o código todo para perceber qual o objectivo dele. Limitei-me a apontar o erro que não permitia o código ser compilado. Terás de explicar o que pretendes e dar exemplos de input e output esperado para que se possa perceber o que poderá estar incorrecto no teu código. 😉 Knowledge is free! Link to comment Share on other sites More sharing options...
crislanio_macedo Posted March 9, 2015 at 03:31 PM Author Report Share #579017 Posted March 9, 2015 at 03:31 PM replica 0 _ = [] replica c a = a:replica (c-1) a Ok, deu certo agora. Obrigado !! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now