反向穿越結構
在 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 下。