假设T
是Foldable
的实例的类型。 如果我需要执行可能失败的折叠,我可以将foldM
与返回Maybe
的函数一起使用。
但是,如果折叠的易错性是T
本身固有的呢?有没有类型类? 换句话说,对于可以折叠的类型,是否有一个类型类,但不能为所有值定义折叠?
这可以推广到除Maybe
以外的其他Monads(或其他类型的构造函数(吗?
更新
我正在寻找这样的东西:
{-# LANGUAGE TypeFamilies #-}
class FoldableT t where
type F t :: * -> *
foldMap :: Monoid m => (a -> m) -> t a -> F t m
那么Foldable
就只是FoldableT
的一个特例,其中F
就是身份。
您可能没有考虑过的一种可能性是用微不足道的可折叠类型包裹不可折叠类型:
newtype Trivial a = Trivial a
deriving (Functor)
instance Foldable Trivial where
foldMap _ _ = mempty
然后,您可以对整个类型派生Foldable
,这将使不可折叠的分支显示为空。