haskell 用于将列表中的数字相加的函数可被3、4整除,但不能被6整除

bvuwiixz  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(139)

写一个函数sumdv,它包含一个整数列表,并将列表中所有能被3或4整除但不能被6整除的数相加。禁止使用函数sum、filter、convolution和列表生成器。

sumdv :: [Integer] -> [a] -> [Integer]
sumdv = add
sumdv [] = 0
sumdv (x:xs) 
    | mod 3 x == 0 || mod 4 x == 0 = x + sumdv (x:xs)
    | mod 6 x == 0 = sumdv (x:xs)

嘿,伙计们,我对正确的类型有点困惑,因为系统只显示“Variable not in scope:sumdv::[Integer] -〉t”。我的想法是,首先我有一个整数列表,因为它必须是“整数”,然后给了我一个不同元素的列表,必须为我加在一起,它是:[Integer] -〉[a] -〉a但它不起作用:(-

vuktfyat

vuktfyat1#

我要说的是,有多个错误:

  • 类型错误(根据描述,您应该接受元素集合并返回一个)
  • 看起来应该删除sumdv = add
  • sumdv (x:xs)调用导致无限递归(您正在调用传递相同输入而未修改的函数)
  • mod参数的顺序错误
  • mod x 6 == 0模式保护应在mod x 3 == 0 || mod x 4 == 0之前,因为只计算第一个匹配保护,如果将mod x 3 == 0放在第一个,则不会筛选出可被6整除数字
  • 您缺少otherwise case的模式保护(当数字不能被3、4或6整除时)

考虑到上面的所有注意事项,示例实现可以如下所示:

sumdv [] = 0
sumdv (x:xs)
    | mod x 6 == 0                  = sumdv (xs) 
    | mod x 3 == 0 || mod x 4 == 0  = x + sumdv (xs)
    | otherwise                     = sumdv (xs)

相关问题