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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top