假设 T
是一个 Foldable
实例的类型。
如果我需要执行可能失败的折叠,我可以将 foldM
与返回 Maybe
的函数结合使用。
但是,如果折叠的错误是 T
本身固有的呢?有这个类型的类吗?
换句话说,是否存在可以折叠的类型的类型类,但不能为所有值定义折叠?
这可以推广到除也许
之外的其他 Monad(或其他类型构造函数)吗?
更新
我正在寻找这样的东西:
{-# LANGUAGE TypeFamilies #-}
class FoldableT t where
type F t :: * -> *
foldMap :: Monoid m => (a -> m) -> t a -> F t m
那么 Foldable
只是 FoldableT
的一个特例,其中 F
是 Identity。
最佳答案
您可能没有考虑过的一种可能性是用可轻松折叠的东西包裹不可折叠类型:
newtype Trivial a = Trivial a
deriving (Functor)
instance Foldable Trivial where
foldMap _ _ = mempty
然后您可以在整个类型上派生 Foldable
,这将使不可折叠分支显示为空。
关于haskell - 是否有易错折叠的类型类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603865/