2

私は署名付きの関数とf署名付きの関数を持っていますf :: [a] -> StateT Int Reader b [c]f'f' :: a -> StateT Int Reader b [c]

f の計算 (非常に単純化されています) は次のようになります。

f [] = return []
f (s:st) = f' s >>= \x ->
           f st >>= \y ->
           return $ ...

[c]そしての代わりに…の部分のx ++部分[c]yモナドのものを巻きつけて返したいと思います。
手動でアンラップせずにそれを達成し、手動で結果を再度まとめる可能性はありxますyか? 単純なコードを取得するには、モナド スタックの一番下に List モナドが必要ですか? Reader モナドは明らかに MonadPlus クラスのインスタンスではありません。

4

3 に答える 3

3

xアンラッピングとの意味がわかりませんy

私は最後の行を

return (x ++ y)

私はあなたが欲しいものを誤解していますか?

于 2010-01-21T09:58:46.120 に答える
2

単純に定義することもできます

f = fmap concat . mapM f'

( mapM f' xstype m [[c]]、 wherexs :: [a]およびの値を生成し、「モナド内で」リストm = StateT Int (Reader b)fmap concat連結します。)

于 2010-01-22T17:09:22.040 に答える
1

f' sとはどちらもf st1 つのモナド、つまり の値ですStateT Int Reader b。Dave Hinton が言ったように、あなたはすでにx :: [c]andを持っていて、y :: [c]書く必要があるだけです。return (x ++ y)

于 2010-01-21T10:26:28.870 に答える