如何使用折叠对树元素求和?
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 中了解更多信息。
(我也是初学者,希望对你和其他人有所帮助)
我正在尝试通过一些示例编码来学习 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 中了解更多信息。
(我也是初学者,希望对你和其他人有所帮助)