Functor -> Applicative -> Monad hierarchy 的重点是什么

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 a = {- ... -} 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。我们最终需要 traverseMonad 特定版本(即 mapM),并根据几乎总是存在的区别从一个版本切换到另一个版本无关紧要。将 Applicative 作为 Monad 的超类意味着我们不必为此烦恼。