我需要为玫瑰树数据结构创建一个可折叠实例:

data Rose a = a :> [Rose a]
    deriving (Eq, Show)

具有以下与monoid和玫瑰相关的类/实例:
instance Functor Rose where
    fmap f (a :> bs) = (f a) :> (map (fmap f) bs)

class Monoid a where
    mempty ::           a
    (<>)   :: a -> a -> a

instance Monoid [a] where
    mempty = []
    (<>)   = (++)

我试过的
instance Foldable Rose where
    fold (a:>b) =  a <> (foldMap fold b)

但是,这不能正常工作,对于系统检查,我得到了错误:
*** Failed! Exception: 'Prelude.undefined':
[] :> []

但是我不确定为什么它不起作用,有人可以帮我吗?

提前致谢!

此致,
Skyfe。

最佳答案

您对 fold 的实现是正确的,没有理由更改它。

问题是 fold 不足以定义 Foldable 。来自 the documentation :



因此,您必须定义 foldMapfoldr(或两者)。定义 foldMap 更容易、更自然(在许多情况下也更有效)。所以你应该写一些类似的东西:

import Data.Foldable
import Data.Monoid

data Rose a = a :> [Rose a]
    deriving (Eq, Show)

instance Foldable Rose where
    foldMap f (x :> xs) = f x <> foldMap (foldMap f) xs

关于class - Haskell monoid可折叠玫瑰树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26257369/

10-11 11:59