Buenos días, en una llamada recursiva a una función del teórico me tira error porque no está definido el "show" o una instancia del mismo para ella:
fact :: Integer -> Integer -> Integer
fact n = factacc 1 n
where
factacc a 0 = abs
factacc a n = factacc(a*n)(n-1)
Cómo podría resolverlo?. Gracias. Saludos
Hola,
El problema que tenés es que el tipo que le pusiste a fact no es correcto. El tipo es Integer ->Integer y no Integer -> Integer -> Integer. Raro que te diga ese error (de que no tiene show), por en este caso el error es que el tipo no se corresponde con el tipo que deduce de la definición de fact.
Couldn't match expected type `Integer -> Integer'
with actual type `Integer'
Quien tiene tipo Integer -> Integer -> Integer es factacc.
Saludos,
Alberto.
El problema que tenés es que el tipo que le pusiste a fact no es correcto. El tipo es Integer ->Integer y no Integer -> Integer -> Integer. Raro que te diga ese error (de que no tiene show), por en este caso el error es que el tipo no se corresponde con el tipo que deduce de la definición de fact.
Couldn't match expected type `Integer -> Integer'
with actual type `Integer'
Quien tiene tipo Integer -> Integer -> Integer es factacc.
Saludos,
Alberto.
Buenas, gracias por la respuesta, pero sigue tirando error aún cambiándole el tipo a fact:
clase3.hs:56:10: error:
* Couldn't match expected type `Integer'
with actual type `a0 -> a0'
* Probable cause: `factacc' is applied to too few arguments
In the expression: factacc 1 n
In an equation for `fact':
fact n
= factacc 1 n
where
factacc a 0 = abs
factacc a n = factacc (a * n) (n - 1)
|
56 | fact n = factacc 1 n
clase3.hs:56:10: error:
* Couldn't match expected type `Integer'
with actual type `a0 -> a0'
* Probable cause: `factacc' is applied to too few arguments
In the expression: factacc 1 n
In an equation for `fact':
fact n
= factacc 1 n
where
factacc a 0 = abs
factacc a n = factacc (a * n) (n - 1)
|
56 | fact n = factacc 1 n
No me había dado cuenta que en el caso base factacc estás devolviendo abs. Tiene que devolver a (el acumulador).
Te da ese error de tipo porque abs es un método de la clase Num de tipo Num a => a -> a. Justo coincidió que devolvés un nombre que existe en el contexto y por eso no te da que no sabe quien es ese identificador.
Saludos,
Alberto.
Te da ese error de tipo porque abs es un método de la clase Num de tipo Num a => a -> a. Justo coincidió que devolvés un nombre que existe en el contexto y por eso no te da que no sabe quien es ese identificador.
Saludos,
Alberto.