Haskell递归函数返回一个布尔

问题描述

我正在尝试编写一个递归函数,以求出一个数字列表,并返回一个Bool来确定总和是否可以被5整除。但是,我无法使其工作。

div5 :: [Int] -> Bool 
div5 (x:xs)  
  | total `mod` 5 == 0 = True
  | otherwise = False
  where
    total = total + x

解决方法

表达式where total = total + x并没有多大意义,因为如果您说total等效于total + x,因此{{1 }},(total + x) + x

一个简单的解决方案是利用sum :: (Foldable f,Num a) => f a -> a对数字求和,然后检查结果是否等于((total + x) + x) + x

0

或采用无点表示法:

div5 :: (Foldable f,Integral a) => f a -> Bool
div5 xs = mod (sum xs) 5 == 0

例如:

div5 :: (Foldable f,Integral a) => f a -> Bool
div5 = (0 ==) . (`mod` 5) . sum

这不仅适用于列表,而且还适用于所有Prelude Data.List> div5 [1,4,2,5] False Prelude Data.List> div5 [1,5,3] True 类型,例如FoldableMaybe等。

但是,如果值很大,或者元素的数量很大,这将给出错误的结果,因为那样一来,就无法再用数字类型来表示总和。但是,我们不需要计算总和,我们可以先计算每个元素的Tree,然后将其总和再次等于(`mod` 5),然后得出总和{{ 1}},因此我们可以检查它是否为0:

mod 5

您可以使用帮助程序函数将其转换为递归函数,该函数执行递归以汇总值(或其等价模块5)。我将其保留为练习。