2016-08-10 10 views
0

モナドTのf1 :: T Stringのような関数を持っていて、その結果を使用したい場合は、例えばそれを出力します。他のモナドの関数であるIOモナドでの使用

seeF1 :: IO String 
seeF1 = do 
    res <- f1 
    print res 

なぜ間違っていますか。モナドIOにはないので、私はf1を使うことができないようです。それで、どうすればいいですか?持ち上げる?あなたは

x = do 
    y <- z 
    .... 

を行う do表記の

+3

「どうすればいいですか? 「T」が何であり、あなたが何を期待しているかによって大きく左右されます。 –

答えて

2

は、次にx :: (Monad m) => m a場合、z :: (Monad m) => m bmが同じモナドでいました。

あなたのTモナドがリストであった場合、あなたのseeF1は何を返すべきか想像してみてください。または、TモナドがMaybeの場合、に遭遇した場合にはseeF1は何も印刷できません。その結果は未定義です。

したがって、一般的に、あなたが求めていることはできません。しかし、あなたがあなたのTについてもう少し具体的であれば、T aからIO aを得る方法が見つかるかもしれません。たとえば、transformersで定義されているモナドを見ると、多くはrunという関数を持っていて、それを変換する関数はIOです。

+4

あなたの主張(「持ち上げ操作を定義する必要がある」)は非常に強すぎると思います。実際に、ほとんどのモナドは、「IO」に「持ち上げられる」賢明な方法を持っています。私の推測では、質問への答えは関数の '実行* 'ファミリの1つに関係することですが、jonaprietoが何をしたいかについてもう少し詳しく述べるまで、ほとんど知りません。 –

+0

はい、あなたは正しいです、私は私の答えを編集:) – villou24

関連する問題