Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Applicative functor that reverses order of effects

Given an applicative functor f, I had an idea of making a new applicative functor Rev f like f but with the order of effects reversed. Here it is:

import Control.Applicative

newtype Rev f a = Rev {unRev :: f a}

instance Functor f => Functor (Rev f) where
  fmap f (Rev fx) = Rev (fmap f fx)

instance Applicative f => Applicative (Rev f) where
  pure x = Rev (pure x)
  (Rev ff) <*> (Rev fx) = Rev (pure (\x f -> f x) <*> fx <*> ff)

My questions are

  1. Is that a valid Applicative instance (does it obey the Applicative laws)?
  2. Does this construction have a name? Is there a module somewhere this is hiding in?
like image 841
PyRulez Avatar asked Dec 13 '15 01:12

PyRulez


1 Answers

The friendly folks on IRC pointed to the Backwards applicative offered by the transformers package. You may also like the (<**>) operator available in the standard library.

like image 80
Daniel Wagner Avatar answered Nov 08 '22 11:11

Daniel Wagner