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 → Integ开发者_如何学Goer
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
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
精彩评论