替代定義

由於每個 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