2016-08-02 11 views
4

私はすべての関数がIO (Maybe T)を返すライブラリ(ghcjs-dom)を扱っています。IO(Maybe(IO(Maybe t)))タイプを扱う方法は?

は、私が戻ってIO (Maybe x)と引数としてxを取り、IO (Maybe y)を返す関数bと機能aを持っています。

私にa ??? bをさせ、IO (Maybe y)を得させる演算子です。私のHoogleの検索で何も表示されませんでした。

私はIO (Maybe (IO (Maybe t)))の代わりに、IO (IO t)またはMaybe (Maybe t)のために働くjoinのようなものを探しています。

+1

「IO Maybe T」とは何ですか?それは優しいエラーのように見えます。 – augustss

+0

@augustss IO(おそらくanyRandomType) – 2426021684

+2

さて、質問の投稿を編集してください。現時点では判読不能です。 – leftaroundabout

答えて

10

私が理解から、あなたが持っている:

a :: IO (Maybe X) 
b :: X -> IO (Maybe Y) 

IO (Maybe a)MaybeT IO aとの間には密接な関係があり、すなわちMaybeTは、他の1つに変換:

MaybeT :: IO (Maybe a) -> MaybeT IO a 

をし、逆の操作だけですrunMaybeT

runMaybeT :: MaybeT IO a -> IO (MaybeT a) 
MaybeT a >>= (\x -> MaybeT (b x)) :: MaybeT IO Y 

これはタイプMaybeT IO Yの値になり:MaybeTモナド実行したい構図でだけ バインド操作です。 IO (Maybe Y)に変換するには、runMaybeTを使用してください。あなたはおそらく、

andThen :: IO (Maybe a) -> (a -> IO (Maybe b)) -> IO (Maybe b) 
andThen a b = runMaybeT $ MaybeT a >>= (\x -> MaybeT (b x)) 

しかし、あなたはこの演算子をたくさん使って自分自身を見つける場合は必要があります。ここでは

更新

B "を構成する" ためのオペレータであります機能を再加工して、MaybeT IO のモナドで作業してから、>>=と1つの外側には があります。

+0

実行されていない場合、操作は成功したかどうかをどのように知ることができますか? – 2426021684

+1

オペレーターの回答が更新されました。 'MaybeT'と' runMaybeT'は実際にそのタイプ以外のIOアクションについて何も変更しません。 'MaybeT'は物事を設定し、'> = 'はNothingの場合を処理するためのグルーロジックを追加し、Justを使って戻り値をラップします。'runMaybeT'は' main'で実行できるようにIOアクションにキャストします。 'main'の一部であるIOアクションが実行されるまでは何も起こりません。 – ErikR

+0

ありがとうございます。残念ながら、関数はghcjs-domにありますので、簡単に変更することはできません。 – 2426021684

3

MaybeTを使用しない場合は、sequenceAまたはtraverseからData.Traversableが必要です。

Prelude Data.Traversable Control.Monad> :t fmap join . join . fmap sequenceA 

fmap join . join . fmap sequenceA 
    :: (Traversable m, Control.Applicative.Applicative f, Monad m, 
     Monad f) => 
     f (m (f (m a))) -> f (m a) 

あなたのケースでは、fはIOとmです。

+0

あなたの答えはErikRと同じですが、すべてのモナドで使えますか?どの答えを使うべきですか? – 2426021684

+1

鉱山はどんなモナドでも機能しません。たいていの場合、リスト形式などのトラバース可能なものが必要です。このようなケースがたくさんある場合は、おそらくMaybeTを使うべきです。 – mb14