高阶类型的等价于Functor或Foldable

3

考虑使用 FunctorFoldable 类型类的以下代码:

{-# 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

我猜想你正在寻找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,不过我怀疑rank2classes对您更有用。


1
感谢@Joseph Sible-Reinstate Monica提供的代码示例! - bradrn
1
另一种不同类型的味道:conkin - dfeuer
@dfeuer 我认为这值得单独回答。 - Joseph Sible-Reinstate Monica
从Barbies http://hackage.haskell.org/package/barbies-2.0.2.0/docs/Data-Functor-Barbie.html#t:TraversableB 的 TaversableB 支持 bfoldMap 函数 http://hackage.haskell.org/package/barbies-2.0.2.0/docs/Data-Functor-Barbie.html#v:bfoldMap。 - danidiaz
1
Rank2.FunctorFunctorOf (~>) (->) 的一个实例。 - Iceland_jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接