反向穿越结构

Backwards applicative functor 的帮助下,遍历可以在相反的方向上运行,该翻转器翻转现有的应用程序,以便组合的效果以相反的顺序发生。

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”。当用 Backwards 翻转 traverse 调用的基础应用时,产生的效果以相反的顺序发生。

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 newtype 位于 Data.Functor.Reverse 下。