首页 > 解决方案 > 有错误折叠的类型类吗?

问题描述

假设T是一个类型,它是Foldable. 如果我需要执行一个可能失败的折叠,我可以使用foldM一个返回Maybe.

但是,如果折叠的易错性是其T自身固有的呢?有一个类型类吗?换句话说,是否有可以折叠的类型的类型类,但不能为所有值定义折叠?

这可以推广到除 之外的其他 Monad(或其他类型的构造函数)Maybe吗?

更新

我正在寻找这样的东西:

{-# LANGUAGE TypeFamilies #-}
class FoldableT t where
    type F t :: * -> *
    foldMap  :: Monoid m => (a -> m) -> t a -> F t m 

那么这只是身份在哪里Foldable的一个特例。FoldableTF

标签: haskell

解决方案


您可能没有考虑过的一种可能性是用可折叠的东西来包装不可折叠的类型:

newtype Trivial a = Trivial a
    deriving (Functor)
instance Foldable Trivial where
    foldMap _ _ = mempty

然后你可以对整个类型进行派生Foldable,它会使不可折叠的分支显示为空。


推荐阅读