使用'res'不会产生(浮点整数)的实例

时间:2017-01-24 12:58:48

标签: haskell

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

1 个答案:

答案 0 :(得分:2)

您无法直接致电res fib,因为res的类型为:

res :: (Floating r, Integral r, RealFrac r, Show r) => [r] -> r
因此,

需要FloatingIntegralRealFracShow类型。

现在看起来您只是构建了一个对类型非常有问题的函数:您希望类型同时为FloatingIntegral

然而,您可以将您的功能重写为:

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不会过滤掉重复数据。