【发布时间】:2014-10-08 12:52:01
【问题描述】:
我需要为玫瑰树数据结构创建一个可折叠的实例:
data Rose a = a :> [Rose a]
deriving (Eq, Show)
使用以下幺半群和玫瑰相关的类/实例:
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。
【问题讨论】:
-
与其更新问题中的解决方案,不如把它写在这里作为答案?
-
不错,没想到这种可能性!
-
deriving (Foldable)和{- LANGUAGE DeriveFoldable -}怎么样? -
您可能需要查看
containers包中的Data.Tree,它是 Haskell 平台的一部分,也随 GHC 一起提供。