Haskell编写友好数判断函数areAmicableNumbers出现类型错误如何修复?
错误原因
- 类型签名错误:函数返回值标注为
[Bool](布尔列表),但判断类函数实际应该返回单个Bool值。 - 运算符操作数类型不匹配:
&&逻辑与运算符仅支持Bool类型的左右操作数,你将两个比较表达式用方括号包裹后,结果变为单元素的[Bool]列表,和运算符要求的类型不符,因此直接触发编译错误。 - 隐藏逻辑缺陷:现有代码计算约数的范围是
[1..x],会把数字本身也计入约数,不符合友好数要求的「小于自身的所有约数之和」的定义,会导致计算结果错误。
修复方案
修改类型签名,去掉比较表达式外层的方括号,同时调整约数计算的范围,修复后的代码如下:
areAmicableNumbers :: Integral a => a -> a -> Bool areAmicableNumbers x y = (sum [k | k <- [1..x-1], x `mod` k ==0]) == y && (sum [i | i <- [1..y-1], y `mod` i ==0]) == x
内容的提问来源于stack exchange,提问作者maros
相关产品推荐
相关产品推荐

