のリストフィルタリング:IO [Either a b]
私はタイプのリストをフィルタリングしようとしていますモナド
理想的には、私は次のタイプのSIGとフィルタリング機能を構成したいと思います:
(Monad m, Monad m2) => m [m2 a] -> (a -> Bool) -> m [m2 a]
私は多くのことを試してみました、filterM
、fmap
、および=<<
は、私の述語を適切なコンテキストに持ち上げようと無駄にしようとしましたが、私はm [m a]-> (a -> m Bool)-> m [m a]
を達成することができますが、どちらも同じモナドではないので、私は何か良いことをしているようだ。
これは「do notation」のようなものですが、私は<-
オペレータで割り当てられたもののタイプシグネチャを調べる方法を捨てることができず、動いているターゲットで撮影しています。
私は、別のモナド(Either)のインスタンスを含むリストと、リスト自体(IO)を含むモナドを含むリストをトラバースしていることを明確にする方法では、どのように関数を構成するのか不明です。
私はここで何が欠けていますか?
あなたは '' m2'に述語をfmap'ことができますが、どのように結果の '平方メートルBool'を検査するつもりですか? @BenjaminHodgsonが指摘しているように、あなたができるのは '(Functor f、Applicative g)=>(a - > Bool) - > f [ga] - > f(g [a])' –
です。 't(fa) - > f(ta)' – jberryman
私は与えられた型のモナドのリストをフィルタリングする関数があると仮定しました。関数をIOモナドに追加します。 内部では、[[Either ab]]のインスタンスを連結することは、インスタンスを連結することとは異なることを理解しています。これは、たとえば、 'filterM(liftM。(\ x-> True) 'IO [Either ab]'の中で、これはうまくいきませんが、それは不可能ではない、単なる頭痛です。 私はこの問題を抱える最初の人ではなく、誰かがそれを解決したと仮定しました。 –