12

関数がある場合f :: State Int ()、別の関数内で使用できますg :: StateT Int IO ()か? でネストすると、 でf = do { something; g }の型チェックに失敗しますCouldn't match type 'Data.Functor.Identity.Identity' with 'IO'

4

1 に答える 1

23

はい、この操作は通常「巻き上げ」と呼ばれます。State モナドの場合、次のように定義できます。

hoistState :: Monad m => State s a -> StateT s m a
hoistState = state . runState

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

于 2013-06-26T16:39:16.500 に答える