Haskell sumdv函数类型错误求助:求能被3/4整除但非6整除的数之和
问题分析与修复
首先,你的函数类型签名完全不符合需求:函数接收一个整数列表,返回它们的和(整数),所以正确的类型签名应该是:
sumdv :: [Integer] -> Integer
接下来看代码里的具体错误:
- 多余的
sumdv = add:add不是Haskell默认函数,这行完全没用,直接删掉。 mod参数顺序反了:Haskell中mod a b是计算a除以b的余数,你写的mod 3 x是求3除以x的余数,和需求完全相反,应该写成xmod3 == 0(或者mod x 3 ==0)。- 递归调用错误:你在递归时用了
sumdv (x:xs),这会无限重复处理同一个头部元素,应该用sumdv xs来处理剩余列表。 - 条件逻辑错误:需求是能被3或4整除,但不能被6整除,你的条件没有把这两个要求结合起来,而且缺少了既不满足3/4整除、也不满足6整除的情况处理。
修复后的完整代码
sumdv :: [Integer] -> Integer sumdv [] = 0 sumdv (x:xs) | (x `mod` 3 == 0 || x `mod` 4 == 0) && x `mod` 6 /= 0 = x + sumdv xs | otherwise = sumdv xs
代码解释
- 类型签名:明确函数接收整数列表,返回整数类型的和。
- 空列表处理:递归的基准情况,空列表的和为0。
- 条件判断:
- 第一个分支:同时满足「能被3或4整除」且「不能被6整除」,就把当前元素x加到剩余列表的和里。
- 第二个分支(otherwise):所有不满足条件的元素,直接跳过,递归处理剩余列表。
这样就能正确实现需求,且符合禁止使用sum、filter等函数的要求。
内容的提问来源于stack exchange,提问作者txm03
相关产品推荐
相关产品推荐

