替代定义

由于每个 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