Cómo utilizar fromInteger en Haskell?
Pregunta
Una forma de calcular 2 ^ 8 en Haskell está escribiendo
product(replicate 8 2)
Cuando se trata de crear una función de esto, se define de la siguiente manera ...
power1 :: Integer → Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)
Me sale el siguiente error:
Couldn't match expected type 'Int' against inferred type 'Integer'
Mi conjetura es que debo utilizar la función fromInteger algún lugar ... No estoy seguro de dónde o cómo? Es una interfaz o lo que es fromInteger, y cómo debo usarlo?
Gracias
Solución
En primer lugar, no utilice nunca fromInteger. Uso fromIntegral.
Puede ver dónde está el error tipo es por mirar el tipo de réplica:
replicate :: Int -> a -> [a]
por lo que cuando se GIV 'k' como un argumento, que usted ha afirmado es un entero a través de la declaración de tipo, tenemos un error de tipo.
Un mejor enfoque para este sería el uso de genericReplicate:
genericReplicate :: (Integral i) => i -> a -> [a]
Así que:
power1 n k = product (genericReplicate k n)
Otros consejos
Tal vez una solución más sencilla es cambiar definición de tipo de la función a:
power1 :: Integer -> Int -> Integer
Usted debe mirar el resto del mensaje de error, así, que te dice exactamente la respuesta a su pregunta:
Couldnt match expected type 'Int' against inferred type 'Integer'
In the first argument of 'replicate', namely 'k'
In the first argument of 'product', namely '(replicate k n)'
In the expression: product (replicate k n)
"En el primer argumento de réplica". Ese es el lugar para añadir el fromIntegral
.