如何解决对于更高级的类型,相当于 Functor 或 Foldable
考虑这段代码,使用 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,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,True]) -- desired result: False
somethingLikeAll null (Bar [] []) -- desired result: True
解决方法
我怀疑您正在寻找 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,True]))
print $ getAll (Rank2.foldMap (All . null) (Bar [] []))
编辑:或者可能是 mmorph
,不过我怀疑 rank2classes
可能对你更有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。