我在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%确定如何使用它将函数应用于列表的所有元素并返回一个总和。
答案 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