0

私は次のモナドの問題で立ち往生しています:

状態S=(LS、RS)の標準モナド状態があるとしましょう。私は別のモナドも持っています:

newtype StateP a = StateP {runP :: S -> (a, RS)}

StatePを使用して計算を実行してから、Stateモナドの状態と状態をマージします。

merge m :: StateP() -> State()
merge m = do
 s@(l,r) <- get
 put (l, snd (runP m s))

動作していませんが、理由がわかりません。そのような機能を実現する別の方法はありますか?

4

3 に答える 3

2

コードがほぼ正しい可能性がある場合は、試してみてください

merge :: StateP() -> State()
merge m = do
    s@(l,r) <- get
    put (l, snd (runP m s))

しかし、あなたは本当に私たちにもっと詳細を与える必要があります。

于 2011-11-04T18:53:20.187 に答える
1

モナド変換子を使用して、2つのモナドスタックを使用してこれらの要件をより明示的にモデル化できます。1つは読み取りのみが可能でLS、もう1つは読み取りと書き込みの両方が可能LSです。

type ReadOnlyLS a  = ReaderT LS (State RS) a
type ReadWriteLS a = StateT LS (State RS) a

ReadOnlyLS内を実行するには、最も外側の状態レイヤーからReadWriteLS抽出LSし、それを内側の計算のリーダーレイヤーに渡して、結果の計算を外側のモナドに戻す必要があります。

merge :: ReadOnlyLS a -> ReadWriteLS a
merge m = get >>= lift . runReaderT m
于 2011-11-04T19:55:48.270 に答える
0

RunPの機能をどのように実現しますか?そのためにモナドインスタンスを再定義し、getP / putPを持っていますか?あなたのコードは問題ないようです、あなたはあなたが使うmを提供できますか?どんな不正行為がありますか?

于 2011-11-04T18:41:59.130 に答える