1
我有一个基本的类型类:Typeclass使用`=>`运算符时的混淆?
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 Monad m => MonadReader r m | m -> r where
是与单子类本作MonadReader类?为什么使用这个?
这就是说'MonadReader r m'成立时'Monad m'必须始终保持。 'Monad m'是'MonadReader r m'的超类(尽管我不确定_superclass_这个单词是否真的可以缩放到像MonadReader这样的多参数类型类)。 – Alec
在函数定义和类定义中,当m是Monad时,'Monad m =>'可以读为*“。在后一种情况下,它确实建立了Monad和MonadReader之间的关系。也就是说,每个MonadReader实例都必须是Monad实例。 IOW它使'Monad'的MonadReader r' a *子类*(如果你可以将这个概念应用于多参数类型类)。 –