Haskell Language Atravesando una estructura en reversa


Ejemplo

Un recorrido se puede ejecutar en la dirección opuesta con la ayuda del funtor aplicativo Backwards , que invierte un aplicativo existente para que los efectos compuestos se realicen en orden inverso.

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 se puede poner en uso en una " traverse invertida". Cuando el aplicativo subyacente de una llamada traverse se invierte con Backwards , el efecto resultante sucede en orden inverso.

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'

El Reverse newtype se encuentra en Data.Functor.Reverse.