2010-12-06 40 views
4

Real World Haskell這本書的http://book.realworldhaskell.org/read/monad-transformers.html#id659032建議在編寫新的Monad變形時,我們必須手動導出MonadState,MonadIO等的實例。爲什麼在編寫新的Monad變形金剛時使用樣板

但我試了下面,它編譯。爲什麼不在圖書館裏完成?

說我有MaybeT單子變壓器:

newtype MaybeT m a = MaybeT { 
    runMaybeT :: m (Maybe a) 
} 

instance Monad m => Monad (MaybeT m) where -- blah blah 

instance MonadTrans MaybeT where 
    lift = MaybeT . (liftM Just) 

然後,一旦我們知道tMonadTransmMonad,爲什麼不能一切自動得出這樣嗎?

instance (MonadTrans t, Monad (t m), MonadIO m) => MonadIO (t m) where 
    liftIO = lift . liftIO 

instance (MonadTrans t, Monad (t m), MonadState s m) => MonadState s (t m) where 
    get = lift get 
    put = lift . put 

是否筆者的意思是,我們必須爲每個新MonadTrans手動做到這一點還是我讓他錯了嗎?

非常感謝你:)

+3

GHC擴展GeneralizedNewtypeDeriving可以自動創建一些monad類的實例,儘管我從來沒有找到哪個monad類的實例。像上面的MonadIO和MonadState這樣的完全參數化實例是「糟糕的形式」。正如FUZxxl在下面所說的,專業化可能有不同的用例,但是,如果你有一個「明顯參數化」的類方法,但你只有一個明顯的實例,它應該只是一個普通的參數函數而不是一個類方法。 – 2010-12-06 11:19:37

回答

4

的原因,他們不這樣做,這是很簡單的:

  1. 首先,它會打破了很多舊的代碼,如果他們想補充一點,因爲你需要一些像UndecidableInstances這樣的東西來讓GHC在自動和手動定義的實例之間做出決定。這將非常麻煩。
  2. 什麼,如果你想定義一個不同於上面的實例,可能是出於性能原因或做一些破解?如果這個實例是內置的,我認爲這個小樣本優於無法/更高的成本(因爲告訴GHC哪個實例你想要的)。
相關問題