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
默认值添加到 Functor
和 Applicative
类 会很好,这样你就不会甚至需要写 via WrappedMonad
,但现在写完了,我怀疑我们永远也写不出来了。太可惜了。
必须编写 Applicative
和 Monad
实例的成本仅由实施者支付一次。然而,没有这些实例的成本一次又一次地由用户承担。考虑一个使用 Applicative
的组合器,例如 traverse
:
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
如果没有超类关系,我们选择 f
作为 Monad
将不足以让我们使用 traverse
。我们最终需要 traverse
的 Monad
特定版本(即 mapM
),并根据几乎总是存在的区别从一个版本切换到另一个版本无关紧要。将 Applicative
作为 Monad
的超类意味着我们不必为此烦恼。
使 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
默认值添加到 Functor
和 Applicative
类 会很好,这样你就不会甚至需要写 via WrappedMonad
,但现在写完了,我怀疑我们永远也写不出来了。太可惜了。
必须编写 Applicative
和 Monad
实例的成本仅由实施者支付一次。然而,没有这些实例的成本一次又一次地由用户承担。考虑一个使用 Applicative
的组合器,例如 traverse
:
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
如果没有超类关系,我们选择 f
作为 Monad
将不足以让我们使用 traverse
。我们最终需要 traverse
的 Monad
特定版本(即 mapM
),并根据几乎总是存在的区别从一个版本切换到另一个版本无关紧要。将 Applicative
作为 Monad
的超类意味着我们不必为此烦恼。