反向穿越结构
在 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 下。