2013-03-04 57 views
2

我在閱讀Monad Transformers Step by Step。第6頁,同時引入的Monad一些子類,筆者給出了下面的代碼示例:Haskell:|在類別聲明中

class (Monad m) => MonadError e m | m -> e where 
    throwError :: e -> m a 
    catchError :: m a -> (e -> m a) -> m a 

class (Monad m) => MonadReader r m | m -> r where 
    ask :: m r 
    local :: (r -> r) -> m a -> m a 

什麼是| m -> e部分是什麼意思?

回答

4

這是一個功能依賴。這是GHC提供的擴展。你可以閱讀更多關於他們here,但他們傳達的基本想法是其中一種類型「確定」另一種類型。他們最近已經失寵,因爲類型家庭可以傳達相同的信息和更多,但更容易理解,功能更強的方式。

編輯:一個例子,取自a question I asked about this topic a year ago

class Shuffle a b | a -> b where 
    indices :: a -> Array Int b 
    reorganize :: a -> Array Int b -> a 

@ehird迴應此解決方案:

我曾與此代碼中使用函數依賴開始

class Shuffle a where 
    type Elt a 
    indices :: a -> Array Int (Elt a) 
    reorganize :: a -> Array Int (Elt a) -> a 

所以發生了什麼本質上是箭頭 'A - > B' 這說'一個決定b'被改變成一個類型族,'a'是類型變量和類型'b'列在類型類中。

+0

同樣是聲明式的,但功能更強大的方式,當然? – 2013-03-04 21:24:23

+0

也許我的意思是更明確。 – 2013-03-04 21:34:51

+0

你能舉一個例子說明如何使用類型族來表達函數依賴的概念嗎?另外,對於後代,這裏是[Haskell wiki類型家族頁面]的鏈接(http://www.haskell.org/haskellwiki/GHC/Type_families)。 – 2013-03-04 21:43:28