我如何为此类型编写可折叠实例?

问题描述 投票:1回答:1

我定义了以下数据类型:

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

haskell typeclass fold
1个回答
0
投票

由于@Willem Van Onsem提示,我找到了正确的实例:

instance Foldable comp => Foldable (SynthesisTreeResult comp) where
  foldMap f (CompNode comp children) = mappend (foldMap f comp) $ mconcat $ map (foldMap f) children
© www.soinside.com 2019 - 2024. All rights reserved.