2

次の行

filterM (\x -> Just (x > 0)) [2, 1, 0, -1] 

出力

Just [2,1]

とライン

filterM (\x -> Just (x > 0)) [] 

ショー

Just []

しかし、私はそれが何も出力しないようにしたいです。リストを操作するすべてのモナド関数で機能する変更を導入するために何ができるでしょうか。それで、filterMの代わりに何か他のものを使用する必要がありますか、それとも多分モナドからいくつかの継承を行うことができますか?

4

3 に答える 3

11

述語に基づいて、を何にもmfilter変換するために使用できます。Just []

 mfilter (not . null) . filterM (Just . (>0)) $ []
于 2013-03-13T10:55:10.643 に答える
8

定義:

flatten :: Maybe [a] -> Maybe [a]
flatten Nothing   = Nothing
flatten (Just []) = Nothing
flatten x         = x

それで

flatten $ filterM (\x -> Just (x > 0)) []
于 2013-03-13T10:55:04.177 に答える
6

リストを操作するすべてのモナド関数を操作するという意味で、あなたが何を意味するのかわかりません。他の未知のモナドのバインドを効果的に変更する必要があるため、これが任意のモナド関数で自動的に行われるようにリストモナドを変更する方法はありません。同様に、すべてのモナド関数を変更するには少し時間がかかります。

私の提案は、構成可能性を使用することです。内側のモナドlistが失敗した場合、外側のモナドmで失敗する必要があります。これはかなり簡単なはずですが、何と呼ぶか​​わからないので、を使用しますfailing

failing :: MonadPlus m => m [a] -> m [a]
failing = (=<<) $ \l -> case l of
    [] -> mzero
    _  -> return l

その後failing $ filterM (\x -> Just (x > 0)) []、あなたが望むことをする必要があります。

この場合、なぜあなたが関与しているのかはわかりませんが(フィルター条件は両方ともJustのみを使用するため)、これを行う他の理由、または時々失敗する他の条件があると思います。

于 2013-03-13T10:57:53.760 に答える