可以在Backwards应用函子的帮助下以相反的方向进行遍历,该函子翻转现有的应用函子,使合成的效果以相反的顺序发生。
newtype Backwards f a = Backwards { forwards :: f a } instance Applicative f => Applicative (Backwards f) where pure = Backwards . pure Backwards ff <*> Backwards fx = Backwards ((\x f -> f x) <$> fx <*> ff)
Backwards可以在“反向traverse”中使用。当traverse调用的基础应用程序被翻转时Backwards,产生的效果将以相反的顺序发生。
newtype Reverse t a = Reverse { getReverse :: t a } instance Traversable t => Traversable (Reverse t) where traverse f = fmap Reverse . forwards . traverse (Backwards . f) . getReverse ghci> traverse print (Reverse "abc") 'c' 'b' 'a'
新Reverse类型位于Data.Functor.Reverse下。