Haskellで次のデータ型を取得しました:
data Flow a = Continue a | Return Value
newtype FlowT m a = FlowT {runFlowT :: m (Flow a)}
type IStateM a = FlowT (StateT IState IO) a
ここで、IState は、いくつかのリストなどを含むレコード タイプです。FlowT の Monad および MonadTrans インスタンスは、次のように定義されます。
instance (Monad m) => Monad (FlowT m) where
x >>= f = FlowT $ do
unwrapped <- runFlowT x
case unwrapped of
Continue v -> runFlowT (f v)
Return r -> return $ Return r
return x = FlowT $ return (Continue x)
instance MonadTrans FlowT where
lift m = FlowT (Continue `liftM` m)
instance (MonadIO m) => MonadIO (FlowT m) where
liftIO m = lift (liftIO m)
instance (MonadState s m) => MonadState s (FlowT m) where
put k = lift (put k)
get = lift get
私の意図は、私がインタープリターを開発しているおもちゃの言語では、何らかの式で return を呼び出すことで、いつでも関数から戻ることができるということでした。関数の呼び出しを解釈するコードを書いているとき、このモナドの舞台裏で渡される Flow 値を抽出する必要があります。IState() には IO が含まれているため、パターン マッチができません。私が必要とする関数は、State の get が動作するのと同様の方法で動作するはずです - 私はそれを呼び出して、何らかの値が返されているかどうかを確認できます。 . これを行う方法?