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