Pergunta

Uma maneira de calcular 2^8 em Haskell é escrevendo

product(replicate 8 2)

Ao tentar criar uma função para isso, definido da seguinte forma ...

power1 :: Integer →  Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)

Estou tendo o erro a seguir:

Couldn't match expected type 'Int' against inferred type 'Integer'

Meu palpite é que devo usar a função Frominteger em algum lugar ... Só não tenho certeza de onde ou como? É uma interface ou o que é do INTEGER, e como devo usá -lo?

Obrigado

Foi útil?

Solução

Em primeiro lugar, nunca use do Integer. Use FromIntegral.

Você pode ver onde o erro de tipo está olhando para o tipo de replicação:

replicate :: Int -> a -> [a]

Então, quando você dá 'k' como um argumento, que você afirmou ser um número inteiro por meio da declaração do tipo, temos um erro de tipo.

Uma abordagem melhor para isso seria usar o genérico:

genericReplicate :: (Integral i) => i -> a -> [a]

Então:

power1 n k = product (genericReplicate k n)

Outras dicas

Talvez uma solução mais simples seja alterar a definição de tipo da função para:

power1 :: Integer -> Int -> Integer

Você deve olhar para o restante da mensagem de erro também, ele diz exatamente a resposta para sua pergunta:

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)

"No primeiro argumento de replicação". Esse é o lugar para adicionar o fromIntegral.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top