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
Conversion from an Integer. An integer literal represents the application of the function fromInteger to the appropriate value of type Integer, so such literals have type. Convert from integer to ring.
Haskell has two integral types, namely Int and Integer . Int is the type of limited-precision integers; this means that there is a smallest integer of type Int , namely minBound , and a greatest integer of type Int , namely maxBound .
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)
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
.
Maybe a simpler solution is to change the function's type definition to:
power1 :: Integer -> Int -> Integer
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With