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)
然後,一旦我們知道t
是MonadTrans
和m
是Monad
,爲什麼不能一切自動得出這樣嗎?
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
手動做到這一點還是我讓他錯了嗎?
非常感謝你:)
GHC擴展GeneralizedNewtypeDeriving可以自動創建一些monad類的實例,儘管我從來沒有找到哪個monad類的實例。像上面的MonadIO和MonadState這樣的完全參數化實例是「糟糕的形式」。正如FUZxxl在下面所說的,專業化可能有不同的用例,但是,如果你有一個「明顯參數化」的類方法,但你只有一個明顯的實例,它應該只是一個普通的參數函數而不是一個類方法。 – 2010-12-06 11:19:37