在haskell中计算2 ^ 8的一种方法是编写
product(replicate 8 2)
尝试为此创建函数时,定义如下...
power1 :: Integer → Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)
我收到以下错误:
Couldn't match expected type 'Int' against inferred type 'Integer'
我的猜测是我必须在某处使用fromInteger功能...我只是不确定在哪里或如何?它是一个接口还是fromInteger,我应该如何使用它?
由于
答案 0 :(得分:11)
首先,永远不要使用fromInteger。使用fromIntegral。
您可以通过查看复制类型来查看类型错误的位置:
replicate :: Int -> a -> [a]
所以当你把'k'作为一个参数,你通过类型声明断言它是一个Integer时,我们有一个类型错误。
更好的方法是使用genericReplicate:
genericReplicate :: (Integral i) => i -> a -> [a]
那么:
power1 n k = product (genericReplicate k n)
答案 1 :(得分:2)
也许更简单的解决方案是将函数的类型定义更改为:
power1 :: Integer -> Int -> Integer
答案 2 :(得分:1)
您应该查看错误消息的其余部分,它会准确地告诉您问题的答案:
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)
“在复制的第一个论点中”。这是添加fromIntegral
。