如何使用折叠对树元素求和?

How to sum tree elements using folds?

我正在尝试通过一些示例编码来学习 Haskell 的 'folds'(仅 'foldr' 和 'foldl')功能。我已经像这样定义了一个树(不是二进制的):

data NTree a = Nil | Tree a [NTree a] deriving Show

我想用一个函数对树的所有元素求和。我已经概述了函数的类型签名和基本情况,但我不确定如何使用折叠来实现逻辑本身。这是我目前所拥有的:

sumElements :: NTree Int -> Int
sumElements Nil = 0
sumElements tree = foldr (???) 0 tree

我真的想不出如何开始。任何填写折叠功能的帮助将不胜感激。

你已经差不多了。

sumElements tree = foldr (+) 0 tree

为了将 foldr 应用于您的树,您应该为您的树定义一个 Foldable 实例。 简而言之,您必须提供一个实现数据类型“可折叠”所需的 2 个函数:foldMap 和 foldr。

您可以在 this tutorial 中了解更多信息。

(我也是初学者,希望对你和其他人有所帮助)