代码之家  ›  专栏  ›  技术社区  ›  Joseph Sible-Reinstate Monica

等价于函子或更高类型的可折叠

  •  0
  • Joseph Sible-Reinstate Monica  · 技术社区  · 4 年前

    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
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Joseph Sible-Reinstate Monica    4 年前

    我怀疑你在找 rank2classes . 例如:

    {-# LANGUAGE FlexibleInstances, StandaloneDeriving, TemplateHaskell #-}
    
    import Data.Maybe
    import Data.Monoid
    import qualified Rank2
    import qualified Rank2.TH
    
    data Bar a = Bar (a Int) (a Bool)
    deriving instance Show (Bar Maybe)
    Rank2.TH.deriveFunctor ''Bar
    Rank2.TH.deriveFoldable ''Bar
    
    main = do
        print $ Rank2.fmap listToMaybe (Bar [1,2,3] [False, True])
        print $ getAll (Rank2.foldMap (All . null) (Bar [1,2,3] [False, True]))
        print $ getAll (Rank2.foldMap (All . null) (Bar [] []))
    

    编辑: mmorph ,尽管我怀疑 等级2