Monad 作為申請人的子類

從 GHC 7.10 開始,Applicative 是 Monad 的超類(即,每種型別的 Monad 也必須是 Applicative)。Applicative(pure,<*>)的所有方法都可以用 Monad(return,>>=)的方法來實現。

很明顯,pure 和 return 服務於同等目的,所以 pure = return。<*> 的定義過於清晰:

mf <*> mx = do { f <- mf; x <- mx; return (f x) }                 
       -- = mf >>= (\f -> mx >>= (\x -> return (f x)))
       -- = [r   | f <- mf, x <- mx, r <- return (f x)]   -- with MonadComprehensions
       -- = [f x | f <- mf, x <- mx]                   

此功能在標準庫中定義為 ap。

因此,如果你已經為型別定義了 Monad 的例項,那麼你可以通過定義免費獲得 Applicative 的例項

instance Applicative < type > where
    pure  = return
    (<*>) = ap

與 monad 準則一樣,這些等效性並未得到執行,但開發人員應確保始終堅持這些等效性。