首页 > 解决方案 > 如何为这种类型编写可折叠实例?

问题描述

我定义了以下数据类型:

data SynthesisTreeResult comp a = CompNode (comp a) [SynthesisTreeResult comp a]
                                | InputLeaf Location

我希望能够将其转换为[comp a]using类型的列表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

标签: haskelltypeclassfold

解决方案


感谢@Willem Van Onsem的提示,我找到了正确的例子:

instance Foldable comp => Foldable (SynthesisTreeResult comp) where
  foldMap f (CompNode comp children) = mappend (foldMap f comp) $ mconcat $ map (foldMap f) children

推荐阅读