11

モナドのスタック、たとえば、、、IOおよびStateとのみErrorを使用する関数がある場合。関数を使用できるように、スタックから中央のモナドを「削除」するにはどうすればよいでしょうか。順序が、、、の場合、タイプを一致させるために使用できますが、モナドスタックに、場合によっては他のモナドが任意の順序で含まれている場合は、関数を使用できるようにしたいと思います。例えば:IOErrorStateIOErrorStateliftIOError

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

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

1 に答える 1

15

の型署名をに変更するだけfunですfun :: (MonadError String m, MonadIO m) => m ()。これにより、エラーが発生し、IOを実行できるモナドスタックString(など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
于 2012-03-08T01:25:52.790 に答える