2012-03-08 10 views
11

モナドのスタックがある場合は、IO,StateErrorと、IOErrorという関数を使用するといいでしょう。私は私の機能を使用することができるので、スタックから "State"のモナドを "削除"する方法はありますか?注文がIO,Error,Stateの場合、種類に合わせてliftを使用できますが、モナドのスタックにIOErrorが含まれていて、おそらく他のモナドが何らかの順序で含まれていると、私の機能を使用できます。たとえば、次のようにモナドスタックの操作

fun :: ErrorT String IO() 
fun = throwError "error" 

someCode :: ErrorT String (StateT Int IO)() 
someCode = do 
    -- I want to use fun here 

答えて

15

だけfun :: (MonadError String m, MonadIO m) => m()funの型シグネチャを変更します。これにより、String Errorを持ち、IOを実行できるすべてのモナドスタック(ErrorT String (StateT Int IO)など)で使用できるようになります。

例:

fun :: (MonadError String m, MonadIO m) => m() 
fun = do 
    liftIO $ putStrLn "in fun" 
    throwError "error" 

someCode :: ErrorT String (StateT Int IO)() 
someCode = do 
    fun 
    -- whatever you want 
+0

これは素晴らしいです、ありがとう! –