我只是在研究真實世界中的單核變壓器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等函數,而不需要實際提升。我想知道這是如何工作,我強烈懷疑它與這些類型的類,但我不知道?
所以,如果我們有'MaybeT(State Int)String'之類的東西,然後我們使用這個,會發生什麼,我認爲我無法理解實際提升如何工作。傳遞給升力功能的是什麼? – Zubair
@Zubair'lift'採取指向內層monad的動作,並將其返回包裹在外層monad中。 IOW,在這種特殊情況下,'lift :: State Int String - > MaybeT(State Int)String'。 –