使用`=>`运算符时类型类混淆?
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
我们有
超类约束 Monad m
,这意味着两个给定类型 r
和 m
可以成为 MonadReader r m
的实例,如果它们不仅实现 MonadReader
定义中列举的方法,但约束 Monad m
也成立,即 m
是 Monad
类型类的一个实例。
从m
决定r
存在函数依赖,即对于MonadReader r1 m1
和MonadReader r2 m2
的任意两个instance
, 如果 m1 ~ m2
则 r1 ~ r2
。
我有基本款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
我们有
超类约束
Monad m
,这意味着两个给定类型r
和m
可以成为MonadReader r m
的实例,如果它们不仅实现MonadReader
定义中列举的方法,但约束Monad m
也成立,即m
是Monad
类型类的一个实例。从
m
决定r
存在函数依赖,即对于MonadReader r1 m1
和MonadReader r2 m2
的任意两个instance
, 如果m1 ~ m2
则r1 ~ r2
。