Аппликативный функтор, который меняет порядок эффектов

Имея аппликативный функтор f, у меня возникла идея создать новый аппликативный функтор Rev f, подобный f, но с обратным порядком эффектов. Вот:

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)

Мои вопросы

  1. Это действительный экземпляр Applicative (подчиняется ли он законам Applicative)?
  2. У этой конструкции есть название? Где-то в каком-то модуле это прячется?

person PyRulez    schedule 13.12.2015    source источник
comment
Если вас интересуют Backwards аппликативные функторы, вам также может понравиться Data.Functor.Reverse, который складывается и перемещается в обратном направлении. Вы также можете найти интересный преобразователь состояния tardis.   -  person dfeuer    schedule 13.12.2015


Ответы (1)


Дружелюбные люди в IRC указали на приложение Backwards, предлагаемое пакет transformers. Вам также может понравиться (<**>) доступен в стандартной библиотеке.

person Daniel Wagner    schedule 13.12.2015