考虑使用 Functor
和 Foldable
类型类的以下代码:
{-# LANGUAGE DeriveFunctor, DeriveFoldable #-}
data Foo a = Foo (Maybe a) [a] deriving(Show, Functor, Foldable)
fmap (+1) (Foo (Just 1) [2,3,4]) -- result: Foo (Just 2) [3,4,5]
sum (Foo (Just 1) [2,3,4]) -- result: 10
是否存在一些类似的类型类可以操作高阶类型参数?例如:
data Bar a = Bar (a Int) (a Bool)
somethingLikeFmap :: forall t f g. SomethingLikeFunctor t => (forall a. f a -> g a) -> t f -> t g
somethingLikeAll :: forall t f. SomethingLikeFoldable t => (forall a. f a -> Bool) -> t f -> Bool
somethingLikeFmap listToMaybe (Bar [1,2,3] [False, True]) -- desired result: Bar (Just 1) (Just False)
somethingLikeAll null (Bar [1,2,3] [False, True]) -- desired result: False
somethingLikeAll null (Bar [] []) -- desired result: True
TaversableB
支持bfoldMap
函数 http://hackage.haskell.org/package/barbies-2.0.2.0/docs/Data-Functor-Barbie.html#v:bfoldMap。 - danidiazRank2.Functor
是FunctorOf (~>) (->)
的一个实例。 - Iceland_jack