数据树的Haskell可折叠实例

Sky*_*yfe 5 haskell instance

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

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)

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

Rom*_*aka 6

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

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