替代定义
由于每个 Applicative Functor 都是一个 Functor ,所以可以随时使用 fmap
; 因此,Applicative 的本质是携带内容的配对,以及创建它的能力:
class Functor f => PairingFunctor f where
funit::f () -- create a context, carrying nothing of import
fpair :: (f a,f b) -> f (a,b) -- collapse a pair of contexts into a pair-carrying context
这个类与 Applicative
同构。
pure a = const a <$> funit = a <$ funit
fa <*> fb = (\(a,b) -> a b) <$> fpair (fa, fb) = uncurry ($) <$> fpair (fa, fb)
反过来,
funit = pure ()
fpair (fa, fb) = (,) <$> fa <*> fb