import Data.List
s = "123456789"
fibs = 1 : scanl (+) 1 fibs
res (x:xs) = if (sort. show $ div x (10^(floor(m) - 8))) == s then x else res xs
where m = logBase 10 x
代码选择fib数的前9位数并检查它们是否与变量s匹配。我试图通过在各个区域插入fromIntegral来解决这个问题,但我似乎无法使其工作,特别是因为错误引用了函数&res 39。请指出我正确的方向。
我得到的错误是:
No instance for (Floating Integer) arising from a use of ‘res’
In the expression: res fibs
In an equation for ‘it’: it = res fibs
答案 0 :(得分:2)
您无法直接致电res fib
,因为res
的类型为:
res :: (Floating r, Integral r, RealFrac r, Show r) => [r] -> r
因此,需要Floating
,Integral
,RealFrac
和Show
类型。
现在看起来您只是构建了一个对类型非常有问题的函数:您希望类型同时为Floating
和Integral
。
然而,您可以将您的功能重写为:
res (x:xs) | s == sort (show (div x (10^(m - 8)))) = x
| otherwise = res xs
where m = floor $ logBase 10 $ fromIntegral x
现在res
的类型为:
res :: (Integral a, Show a) => [a] -> a
如果我现在运行res fib
,它会给出:
*Main> res fibs
*** Exception: Negative exponent
这是合乎逻辑的,因为你给它一个负指数(10^(m-8))
。我的猜测是你只想省略这些情况,以便将其重写为:
res (x:xs) | m >= 8 && s == sort (show (div x (10^(m - 8)))) = x
| otherwise = res xs
where m = floor $ logBase 10 $ fromIntegral x
如果我现在运行res fibs
程序似乎在计算(并且在合理的时间内找不到解决方案,它最终甚至会占用所有可用内存)。
如果你想检查每个数字是否存在,你不能简单地使用sort,因为sort不会过滤掉重复数据。