モナドtranformersと複数のモナドのスタッキング
-
22-09-2019 - |
質問
私は署名で署名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
をアンラップし、手動せずにもう一度一緒に結果を置くことを達成する可能性はありますか?私は、単純なコードを得るために、私のモナドスタックの一番下にリストモナドは必要ですか?リーダーモナドは明らかにMonadPlusのクラスのインスタンスではありません。
解決
私はあなたがx
とy
をアンラップ何を意味得ることはありません。
私は
のように、最後の行を持っているでしょうreturn (x ++ y)
ドI誤解何をしたい?
他のヒント
あなたは、単に定義することができます。
f = fmap concat . mapM f'
(mapM f' xs
がタイプm [[c]]
、 "モナド内部" xs :: [a]
とm = StateT Int (Reader b)
、次いでfmap concat
を連結リストの値を生成する。)
f' s
とf st
両方は、一のモナド、すなわちStateT Int Reader b
の値です。すでにx :: [c]
とy :: [c]
を持っているとデイブヒントンが言ったようにあなただけの、書き込みreturn (x ++ y)
する必要があるので。
所属していません StackOverflow