You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell sumdv函数类型错误求助:求能被3/4整除但非6整除的数之和

问题分析与修复

首先,你的函数类型签名完全不符合需求:函数接收一个整数列表,返回它们的和(整数),所以正确的类型签名应该是:

sumdv :: [Integer] -> Integer

接下来看代码里的具体错误:

  • 多余的sumdv = add:add不是Haskell默认函数,这行完全没用,直接删掉。
  • mod参数顺序反了:Haskell中mod a b是计算a除以b的余数,你写的mod 3 x是求3除以x的余数,和需求完全相反,应该写成x mod 3 == 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

代码解释

  1. 类型签名:明确函数接收整数列表,返回整数类型的和。
  2. 空列表处理:递归的基准情况,空列表的和为0。
  3. 条件判断:
    • 第一个分支:同时满足「能被3或4整除」且「不能被6整除」,就把当前元素x加到剩余列表的和里。
    • 第二个分支(otherwise):所有不满足条件的元素,直接跳过,递归处理剩余列表。

这样就能正确实现需求,且符合禁止使用sum、filter等函数的要求。

内容的提问来源于stack exchange,提问作者txm03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:35:24