У меня есть базовый класс типов:Заблуждения при использовании `=>` оператора?
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 относится к классу Монада? Почему это используется?
Это говорит о том, что 'Monad m' должно всегда выполняться, когда выполняется' MonadReader r m'. «Monad m' - суперкласс« MonadReader r m »(хотя я не уверен, что слово _superclass_ действительно предназначалось для масштабирования для классов с несколькими параметрами типа« MonadReader »). – Alec
'Monad m =>' можно читать как * ", когда m является Monad" *, как в определении функции, так и в определении класса. В последнем случае он устанавливает связь между Monad и MonadReader. А именно, каждый экземпляр «MonadReader r» обязательно является экземпляром «Monad». IOW делает «MonadReader r' a * подкласс *« Monad »(если вы можете применить это понятие к классам типа многопараметрического типа). –