我定义了以下数据类型:
data SynthesisTreeResult comp a = CompNode (comp a) [SynthesisTreeResult comp a]
| InputLeaf Location
我希望能够使用[comp a]
将其转换为toList
类型的列表,这需要Foldable
的实例。
我试图通过实现foldMap
来编写实例:
class Foldable f where
foldMap :: Monoid m => (a -> m) -> f a -> m
但是,由于comp :: * -> *
,我必须写instance Foldable (SynthesisTreeResult comp) where ...
,这导致foldMap
具有以下类型
foldMap :: Monoid m => (a -> m) -> SynthesisTreeResult comp a -> m
但是我需要
foldMap :: Monoid m => (comp a -> m) -> SynthesisTreeResult comp a -> m
能够折叠。
有可能吗?也许我需要在Functor
上加上comp
?
由于@Willem Van Onsem提示,我找到了正确的实例:
instance Foldable comp => Foldable (SynthesisTreeResult comp) where
foldMap f (CompNode comp children) = mappend (foldMap f comp) $ mconcat $ map (foldMap f) children