2015-12-13 6 views
6

Учитывая прикладной функтор 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. Имеет ли эта конструкция название? Есть ли где-нибудь модуль, в котором это скрывается?
+0

Если вам интересны аппликативные функторы 'Backwards', вам также может понравиться' Data.Functor.Reverse', который складывается и перемещается назад. Вы также можете найти трансформатор состояния tardis. – dfeuer

ответ

10

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