尝试使用以下代码为数据树创建可折叠实例:
data Rose a = a :> [Rose a]
deriving (Eq, Show)
instance Foldable Rose where
fold (a:>b) = a <> (map fold b)
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用,它产生的错误:
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'
...
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么/如何使它工作?
在编写时fold b,您正在使用Foldable列表实例.因此,将fold单个值的列表折叠为单个值.这个monoidal值的类型恰好是Rose a(这就是你的列表所包含的).但那可能不是你想要的.
尝试使用foldMap fold而不是fold那里.这样,您首先折叠Rose a列表中的每个人,然后将结果折叠在一起.