Haskell数据树的可折叠实例化

6
尝试使用以下代码创建可折叠的数据树实例:
data Rose a = a :> [Rose a]
    deriving (Eq, Show)

instance Foldable Rose where
    fold (a:>b) =  a <> (map fold b)

然而,这段代码并未起作用,它产生的错误是:
Could not deduce <m ~ [m]>
from the context <Monoid m>
  bount by the type signature for fold :: Monoid m => Rose m -> m
...
In the return type of a call of 'map'
...

有人知道为什么/如何使其工作吗?

“is not working”并不是很有用。它没有通过类型检查吗?那么错误信息是什么?还是它产生了错误的结果?在什么输入下? - Roman Cheplyaka
我编辑了我的帖子,加入了我遇到的错误信息。 - Skyfe
你理解这个错误信息的意思吗?如果你慢慢读,我敢打赌你会知道如何解决问题。如果不行,你也应该说出你不理解错误的哪一部分。 - Daniel Wagner
我建议在实现Foldable时实现foldMap。当您实现几个foldMap时,您会开始注意到它们具有规则的形状。 - Sjoerd Visscher
1个回答

6
当你写下fold b时,你使用的是列表的Foldable实例。所以fold将一系列可结合值折叠成单个值。这个可结合值的类型恰好是Rose a(这就是你的列表由什么组成)。但这可能不是你想要的。
尝试使用foldMap fold而不是fold。这样你可以先折叠列表中的每个Rose a,然后再将结果折叠在一起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接