[英]What is the point of the Functor -> Applicative -> Monad hierarchy
讓 Functor 成為 Applicative 和 Monad 的超級 class 有什么意義。 據我所知,Applicative 和 Monad 都立即暗示了 Functor 的唯一實現。 但是我每次都必須輸入相同的 Functor 實現。 有沒有辦法避免這樣做?
此外,Monad 意味着 Applicative 的唯一實現是遵守法律的,那么為什么讓 Applicative 成為 Monad 的超級 class 呢? 它再次使得為新數據類型實現 Applicative 變得多余。
有沒有一種方法可以在不必實現 Applicative 和 Functor 的情況下制作 Monad(因為它的操作已經是最通用的了)。 並且無需實現 Functor 即可制作 Applicative。
我看到了 class 層次結構的好處,因為我剛才所說的解釋了它們之間的“是”關系。 但同時必須實現每一個都很煩人。 我只想定義return
和>>=
並獲取所有 3 的所有操作。
您可以通過以下方式獲取這些實例:
import Control.Applicative
data Whatever = {- ... -} deriving (Functor, Applicative) via (WrappedMonad Whatever)
在編譯器違反規范時將DefaultSignatures
默認值添加到Functor
和Applicative
類會很好,這樣你甚至不需要via WrappedMonad
編寫,但現在已經完成了,我懷疑我們永遠不會得到他們。 太糟糕了。
編寫Applicative
和Monad
實例的成本只需由實現者支付一次。 然而,沒有這些實例的成本由用戶一次又一次地承擔。 考慮一個使用Applicative
的組合器,例如traverse
:
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
如果沒有超類關系,我們選擇f
作為Monad
將不足以讓我們使用traverse
。 我們最終需要一個特定於Monad
的traverse
版本(即mapM
),並基於幾乎總是不相關的區別從一個切換到另一個。 將Applicative
作為Monad
的超類意味着我們不必為此煩惱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.