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 準則一樣,這些等效性並未得到執行,但開發人員應確保始終堅持這些等效性。