反向穿越結構

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 下。