数据树的Haskell可折叠实例

时间:2013-10-11 14:44:35

标签: haskell instance

尝试使用以下代码为数据树创建可折叠实例:

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

有谁知道为什么/如何让它发挥作用?

1 个答案:

答案 0 :(得分:6)

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

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