如何将函数应用于Haskell中的所有子项

时间:2018-03-05 02:03:25

标签: haskell

我在Haskell中使用递归数据类型非常困难。我在做实际任务之前正在尝试一些练习问题,但我发现一个问题就是不断让我无法解决其中的一些问题。 我们有

data Person = MakePerson String [Person]

说我想计算

中的所有人数
charles = MakePerson "Charles" [MakePerson "Charlotte" [], 
MakePerson "Phil" [MakePerson "Tom" []]]

这是我到目前为止所拥有的

countPeople :: Person -> Int
countPeople (MakePerson a b)
    | b == [] = 1
    | otherwise = 1 + countPeople (head b)

但是,我不知道如何将此功能应用于人员列表中的每个元素,而不是列表的头部。我在考虑使用map,但我并不是100%确定如何使用它将函数应用于列表的所有元素并返回一个总和。

2 个答案:

答案 0 :(得分:2)

您可以将此视为获取每个孩子的计数,将这些孩子计算在一起并添加一个。

countChildren :: Person -> Int
countChildren (MakePerson _ []) = 1  -- a person with no children
countChildren (MakePerson _ xs) = 1 + sum (map countChildren xs)

答案 1 :(得分:1)

您正在寻找的功能是

sum :: [Int] -> Int

例如,sum [1,2,3] = 6

然后,您可以使用它来汇总列表(sum map countPeople之后的列表。

这是我发现有用的更一般的指南。 http://learnyouahaskell.com/chapters