2013-06-26 8 views
10
と組み合わせる

私は、機能がであれば、それを別の機能の中で使うことは可能ですかg :: StateT Int IO()f = do { something; g }でネストすると、Couldn't match type 'Data.Functor.Identity.Identity' with 'IO'で型チェックできません。StateT IOを状態

+0

'g = do {something; f} '?あなたはg内のfを使用したいのですが、そうですか? – gumik

答えて

18

はい、この操作は通常「巻上げ」と呼ばれます。ただ、次の関数を定義して使用します。

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

を残念ながら、それはControl.Monad.Stateモジュールで定義されていません。

+0

素晴らしいです、ありがとう! – Fraser

+3

[mmorphパッケージのチュートリアル](http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#g:4)も参照してください。 –

+2

@GabrielGonzalez 'hoistId ::(Monad m)=> t Identity a - > tma'を持つモナド変換器の型クラスが、基本ライブラリに便利な(Haskell98)追加のように思えます。ファンクタ 'returnのための' MFunctor'の特別なバージョンです。 runIdentity'です。 –