2017-02-12 27 views
1

У меня есть базовый класс типов:Заблуждения при использовании `=>` оператора?

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 относится к классу Монада? Почему это используется?

+1

Это говорит о том, что 'Monad m' должно всегда выполняться, когда выполняется' MonadReader r m'. «Monad m' - суперкласс« MonadReader r m »(хотя я не уверен, что слово _superclass_ действительно предназначалось для масштабирования для классов с несколькими параметрами типа« MonadReader »). – Alec

+1

'Monad m =>' можно читать как * ", когда m является Monad" *, как в определении функции, так и в определении класса. В последнем случае он устанавливает связь между Monad и MonadReader. А именно, каждый экземпляр «MonadReader r» обязательно является экземпляром «Monad». IOW делает «MonadReader r' a * подкласс *« Monad »(если вы можете применить это понятие к классам типа многопараметрического типа). –

ответ

3

В

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

мы имеем

  1. Суперкласс ограничение Monad m, что означает, что данные два типа r и m могут быть сделаны экземпляры MonadReader r m, если они не только реализуют методы, перечисленные в MonadReader, но также имеет место ограничение Monad m, то есть m является экземпляром типа Monad класс.

  2. Существует функциональная зависимость определения r от m, то есть для любых двух instance с после MonadReader r1 m1 и MonadReader r2 m2, если m1 ~ m2 затем r1 ~ r2.

 Смежные вопросы

  • Нет связанных вопросов^_^