Haskell 没有因使用‘;res’;

Haskell 没有因使用‘;res’;,haskell,Haskell,该代码选取fib编号的前9位数字,并检查它们是否与变量s匹配。我试图通过在不同的区域插入fromIntegral来解决这个问题,但我似乎无法使它工作,特别是因为错误的引用函数“res”。请给我指一下正确的方向 我得到的错误是: 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

该代码选取fib编号的前9位数字,并检查它们是否与变量s匹配。我试图通过在不同的区域插入fromIntegral来解决这个问题,但我似乎无法使它工作,特别是因为错误的引用函数“res”。请给我指一下正确的方向

我得到的错误是:

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

您不能直接调用
res fib
,因为
res
具有以下类型:

No instance for (Floating Integer) arising from a use of ‘res’
In the expression: res fibs
In an equation for ‘it’: it = res fibs
res (x:xs) | s == sort (show (div x (10^(m - 8)))) = x
           | otherwise = res xs
           where m = floor $ logBase 10 $ fromIntegral x
因此,它需要的类型是
浮动
积分
RealFrac
显示

现在看来,您只是简单地构造了一个对于类型来说非常有问题的函数:您希望类型同时是
浮点型
整数型

但是,您可以将函数重写为:

res :: (Floating r, Integral r, RealFrac r, Show r) => [r] -> r
如果现在运行
res fib
,它会给出:

res :: (Integral a, Show a) => [a] -> a
这是合乎逻辑的,因为你给它一个负指数
(10^(m-8))
。我的猜测是,您只是想省略这些情况,以便将其改写为:

*Main> res fibs
*** Exception: Negative exponent
res(x:xs)|m>=8&&s==sort(show(divx(10^(m-8)))=x
|否则=res xs
其中m=地板$logBase 10$from积分x
如果我现在运行
res fibs
程序似乎在计算(并且没有在合理的时间内找到解决方案,它最终甚至会占用所有可用内存)


但是,如果要检查每个数字是否存在,则不能简单地使用sort,因为sort不会过滤掉重复的数字。

请同时打印编译器错误。编译器错误为:无(浮点整数)实例由于在表达式中使用了“res”:res fibs表示“it”:it=res fibs请以后回答您的问题。我通过在GHCI 7.10.3中键入res fibs来运行代码。威廉注意到了。非常感谢威廉的详细解释。这很有帮助。
res (x:xs) | m >= 8 && s == sort (show (div x (10^(m - 8)))) = x
           | otherwise = res xs
           where m = floor $ logBase 10 $ fromIntegral x