tags:

views:

359

answers:

3

One way to calculate 2^8 in haskell is by writing

product(replicate 8 2)

When trying to create a function for this, defined as follows...

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

i get the following error:

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

My guess is that I must use the fromInteger function somewhere... I'm just not sure where or how? Is it an interface or what is fromInteger, and how should I use it?

Thanks

+8  A: 

Firstly, never use fromInteger. Use fromIntegral.

You can see where the type error is by looking at the type of replicate:

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

so when you giv it 'k' as an argument, which you've asserted is an Integer via the type declaration, we have a type error.

A better approach for this would be to use genericReplicate:

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

So then:

power1 n k = product (genericReplicate k n)
Don Stewart
you should mention that `genericReplicate` is in `Data.List` module
newacct
why not use fromInteger?
Mickel
A: 

Maybe a simpler solution is to change the function's type definition to:

power1 :: Integer -> Int -> Integer
Jacob
+1  A: 

You should look at the rest of the error message as well, it tells you exactly the answer to your question:

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)

"In the first argument of replicate". That's the place to add the fromIntegral.

yairchu