假设有一个应用函子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)
我的问题是:
- 这是一个有效的
Applicative
实例吗(是否遵守了Applicative
定律)? - 这个构造有名称吗?有没有某个模块隐藏在其中?