Jump to content

Função Replicate erro


crislanio_macedo
 Share

Recommended Posts

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 by thoga31
GeSHi
Link to comment
Share on other sites

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)
  • Vote 1

Knowledge is free!

Link to comment
Share on other sites

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 by thoga31
Correcção do quote + GeSHi
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • 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.