替代定義
由於每個 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