使用`=>`运算符时类型类混淆?

Typeclass confusions when using `=>` operator?

我有基本款class:

class MyClass a where
  (-+) :: a -> a -> a

instance MyClass Int where
  e1 -+ e2 = e1 + e2 * 100

myFunction :: MyClass a => a -> a -> a
myFunction e1 e2 = e1 -+ e2

我明白上面的工作原理了。

但是,我不明白 => 运算符在这种类型class 声明中的用法:

class Monad m => MonadReader r m | m -> r where

这是否使 MonadReader class 与 Monad class 相关?为什么要用这个?

class Monad m => MonadReader r m | m -> r where

我们有

  1. 超类约束 Monad m,这意味着两个给定类型 rm 可以成为 MonadReader r m 的实例,如果它们不仅实现 MonadReader 定义中列举的方法,但约束 Monad m 也成立,即 mMonad 类型类的一个实例。

  2. m决定r存在函数依赖,即对于MonadReader r1 m1MonadReader r2 m2的任意两个instance , 如果 m1 ~ m2r1 ~ r2