2013-06-26 20 views
10

f :: State Int() işlevim varsa, g :: StateT Int IO() numaralı başka bir işlevde kullanmak mümkün mü? f = do { something; g } ile iç içe yerleştirme, Couldn't match type 'Data.Functor.Identity.Identity' with 'IO' ile yazım denetimi başarısız olur.StateT IO öğesinin State ile kaynaştırılması

+0

Burada bulunmaması gerekenler g = do {something; f} ' F içinde g kullanmak ister misin? – gumik

cevap

18

Evet, bu işlem genellikle "kaldırma" olarak adlandırılır. Sadece tanımlamak ve aşağıdaki işlevini kullanın:

hoistState :: Monad m => State s a -> StateT s m a 
hoistState = StateT . (return .) . runState 

Ne yazık ki, Control.Monad.State modülünde tanımlı değil.

+0

Harika, teşekkürler! – Fraser

+3

Ayrıca bakınız [mmorph' paketi için öğretici] (http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#g:4) –

+2

@GabrielGonzalez 'hoistId :: (Monad m) => t ile bir monad transformatörleri için bir tür sınıfına sahip gibi görünüyor.> A -> tma', temel kitaplıklara faydalı (Haskell98) eklenir. Bu, functor dönüşü için 'MFunctor'ın sadece özel bir versiyonu olur. runIdentity'. –

İlgili konular