2017-02-12 26 views
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類?爲什麼使用這個?

+1

這就是說'MonadReader r m'成立時'Monad m'必須始終保持。 'Monad m'是'MonadReader r m'的超類(儘管我不確定_superclass_這個單詞是否真的可以縮放到像MonadReader這樣的多參數類型類)。 – Alec

+1

在函數定義和類定義中,當m是Monad時,'Monad m =>'可以讀爲*「。在後一種情況下,它確實建立了Monad和MonadReader之間的關係。也就是說,每個MonadReader實例都必須是Monad實例。 IOW它使'Monad'的MonadReader r' a *子類*(如果你可以將這個概念應用於多參數類型類)。 –

回答

3

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

我們

  1. 超類約束Monad m,這意味着兩個給定類型rm可以由MonadReader r m情況下,如果他們不僅實現所列舉的方法MonadReader的定義,也是約束條件Monad m,即mMonad類型的一個實例類。

  2. 有一個函數依賴確定rm,即用於的MonadReader r1 m1MonadReader r2 m2任何兩個instance S,如果m1 ~ m2r1 ~ r2然後。