Functor -> Applicative -> Monad 层次结构的意义是什么

Has*_*wn 5 monads haskell functor applicative default-method

让 Functor 成为 Applicative 和 Monad 的超类有什么意义呢?据我所知,Applicative 和 Monad 都立即暗示了 Functor 唯一遵守法律的实现。但我每次都必须输入相同的 Functor 实现。有没有办法避免这样做?

更进一步,Monad 暗示了 Applicative 唯一遵守法律的实现,那么为什么要让 Applicative 成为 Monad 的超类呢?它再次使得为新数据类型实现 Applicative 变得多余。

有没有一种方法可以制作一个 Monad,而不必实现 Applicative 和 Functor(因为它的操作已经是最通用的)。并且无需实现 Functor 即可创建 Applicative。

我看到了类层次结构的好处,因为我刚才所说的解释了它们之间的“是”关系。但同时必须实现每一个都是烦人的。我只想定义returnand>>=并获取所有 3 个操作的所有操作。

Dan*_*ner 9

您可以通过以下方式获取这些实例:

import Control.Applicative
data Whatever a = {- ... -} deriving (Functor, Applicative) via (WrappedMonad Whatever)
Run Code Online (Sandbox Code Playgroud)

DefaultSignatures在编译器违反规范时向Functor和类添加默认值本来很好Applicative,这样您甚至不需要编写via WrappedMonad,但现在已经完成了,我怀疑我们永远不会得到它们。太糟糕了。

  • 请不要通过“WrappedMonad”派生“Functor”。更好地“库存”派生它。(对于“Applicative”,直接实现实例也总是值得考虑的,而不是搭载“Monad”实例,这很可能效率较低。) (2认同)