尝试使用以下代码为数据树创建可折叠实例:
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'
...
有谁知道为什么/如何让它发挥作用?
答案 0 :(得分:6)
当您编写fold b
时,您正在使用Foldable
实例作为列表。因此fold
将幺半群值列表折叠为单个值。这个monoidal值的类型恰好是Rose a
(这是你的列表所包含的)。但那可能不是你想要的。
尝试在那里使用foldMap fold
而不是fold
。这样,您首先折叠列表中的每个Rose a
,然后将结果折叠起来。