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'
...

有谁知道为什么/如何使它工作?

4

1 回答 1

6

当您编写时fold b,您将Foldable实例用于列表。因此,fold将一个幺半群值列表折叠为单个值。这个 monoidal 值的类型恰好是Rose a(这就是您的列表所包含的内容)。但这可能不是你想要的。

尝试使用foldMap fold而不是fold那里。这样,您首先Rose a将列表中的每个人折叠起来,然后将结果折叠在一起。

于 2013-10-11T14:55:03.380 回答