我需要为玫瑰树数据结构创建一个可折叠实例:
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 :
因此,您必须定义 foldMap
或 foldr
(或两者)。定义 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/