开发者

How to use fromInteger in Haskell?

开发者 https://www.devze.com 2022-12-10 13:00 出处:网络
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...

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
0

精彩评论

暂无评论...
验证码 换一张
取 消