求问:我的Haskell素数检测函数出现类型错误,问题出在哪?
解决Haskell素数判断代码的类型错误问题
嘿,我来帮你搞定这个困扰你的类型错误!
首先,咱们先拆解一下你遇到的两个关键报错:
No instance for (RealFrac Int) arising from a use of ‘floor’No instance for (Floating Int) arising from a use of ‘sqrt’
这两个错误的核心原因是类型不匹配:
sqrt函数要求输入是Floating类型(比如Double、Float),但你直接传入了Int类型的n,而Int并没有实现Floating类型类;floor函数要求输入是RealFrac类型,同样Int也不满足这个约束,而且sqrt返回的是Floating类型的值,直接传给floor也需要确保类型兼容。
修复方案
我们只需要把Int类型的n转换成Floating类型来计算平方根,再把结果转换回Int即可,用fromIntegral函数就能完成这个类型转换。修改后的代码如下:
isPrime :: Int -> Bool isPrime 1 = False isPrime n = divTest n (floor (sqrt (fromIntegral n))) where divTest :: Int -> Int -> Bool divTest n test | test == 1 = True | mod n test == 0 = False | otherwise = divTest n (test-1)
简单解释
fromIntegral n:把Int类型的n转换成Double(编译器自动推导的合适Floating类型),这样就能被sqrt接受;sqrt计算出平方根后,floor把这个浮点数结果转换成Int类型,刚好符合divTest第二个参数的类型要求。
虽然你提到知道这段代码效率不高,不过作为学习阶段的实现已经很棒啦!如果之后想优化,还可以试试只测试奇数除数、从2开始向上遍历(而不是从平方根往下)之类的小技巧~
内容的提问来源于stack exchange,提问作者mocha2007
相关产品推荐
相关产品推荐

