簡體   English   中英

Functor -> Applicative -> Monad 層次結構的意義是什么

[英]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默認值添加到FunctorApplicative類會很好,這樣你甚至不需要via WrappedMonad編寫,但現在已經完成了,我懷疑我們永遠不會得到他們。 太糟糕了。

編寫ApplicativeMonad實例的成本只需由實現者支付一次。 然而,沒有這些實例的成本由用戶一次又一次地承擔。 考慮一個使用Applicative的組合器,例如traverse

traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)

如果沒有超類關系,我們選擇f作為Monad將不足以讓我們使用traverse 我們最終需要一個特定於Monadtraverse版本(即mapM ),並基於幾乎總是不相關的區別從一個切換到另一個。 Applicative作為Monad的超類意味着我們不必為此煩惱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM