質問

私は署名で署名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の一部を返すようにしたいと思います。
手動xyをアンラップし、手動せずにもう一度一緒に結果を置くことを達成する可能性はありますか?私は、単純なコードを得るために、私のモナドスタックの一番下にリストモナドは必要ですか?リーダーモナドは明らかにMonadPlusのクラスのインスタンスではありません。

役に立ちましたか?

解決

私はあなたがxyをアンラップ何を意味得ることはありません。

私は

のように、最後の行を持っているでしょう
return (x ++ y)

ドI誤解何をしたい?

他のヒント

あなたは、単に定義することができます。

f = fmap concat . mapM f'

mapM f' xsがタイプm [[c]]、 "モナド内部" xs :: [a]m = StateT Int (Reader b)、次いでfmap concatを連結リストの値を生成する。)

f' sf st両方は、一のモナド、すなわちStateT Int Reader bの値です。すでにx :: [c]y :: [c]を持っているとデイブヒントンが言ったようにあなただけの、書き込みreturn (x ++ y)する必要があるので。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top