简体   繁体   中英

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?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM