2016-09-22 76 views
3

我只是在研究真實世界中的單核變壓器Haskell。 這本書說,爲了製造一個monad變壓器,你需要把它變成MonadTrans類型的一個實例。Monad變形金剛電梯

所以本書定義了一臺新的變壓器,即MaybeT m a變壓器。

他們定義的monadTrans型類新變壓器:

instance MonadTrans MaybeT where 
    lift m = MaybeT (Just `liftM` m) 

然後他們作出MonadState的一個實例,該變壓器:

instance (MonadState s m) => MonadState s (MaybeT m) where 
    get = lift get 
    put k = lift (put k) 

從我的理解提升功能,走的是基礎monad並將其包裝在正確的構造函數中。但是,我沒有獲得或放入MonadState類型的實現,我希望在理解電梯實際在這裏做什麼的幫助。我也聽說在mtl包中,由於類型類是如何定義的,你可以有一堆帶有WriterT,StateT等的monad變換器,但是你可以使用get,put,tell等函數,而不需要實際提升。我想知道這是如何工作,我強烈懷疑它與這些類型的類,但我不知道?

回答

1

但你可以使用功能,如GET,PUT告訴等等,而無需實際做任何吊裝

這是因爲這些功能實際上是在例如定義MonadState類型類型,而不是State類型。

class Monad m => MonadState s m | m -> s where 
    get :: m s 
    put :: s -> m() 

然後,既StateStateT由該類的實例,這使得使用這些可能

在您的例子來說,如果我們知道的MaybeT m內單子是(滿足)MonadState s,我們可以將整個外部單子視爲MonadState s,前提是我們將操作指向內部單子,以使它們適合外部單子,這與lift完成。

在普通的英語,那會聽起來像「如果MaybeT變壓器變換(套)在一些單子m作爲用於s類型有狀態(MonadState)單子,所得到的類型也是用於該類型有狀態單子「。


這其實只是一個例子,因爲State s a實際上是爲StateT s Identity a實現。 Refer to the sources的實現細節。

+0

所以,如果我們有'MaybeT(State Int)String'之類的東西,然後我們使用這個,會發生什麼,我認爲我無法理解實際提升如何工作。傳遞給升力功能的是什麼? – Zubair

+0

@Zubair'lift'採取指向內層monad的動作,並將其返回包裹在外層monad中。 IOW,在這種特殊情況下,'lift :: State Int String - > MaybeT(State Int)String'。 –