のスタック内のモナド。このエラーのため、このタイプの署名のように見えます。これはdo
と一致しません。しかし、私はそれをどのように修正するか分かりません。私はいくつかlift
の組み合わせを試しましたが、それらのどれも働いていませんし、もう推測したくありません。は、たぶん私は、次のコードを持っている変圧器
答えて
問題はMaybe
がトランススタックの一部ではないという点です。変圧器がStateT Int
とIO
しか知っていない場合は、Maybe
を持ち上げる方法については何も知られていません。あなたが好きなものにあなたのタイプT
を変更することでこの問題を解決することができ
:
type T = StateT Int (MaybeT IO) Int
(あなたはControl.Monad.Trans.Maybe
をインポートする必要があります。)
またで動作するようにあなたの内側のdo
を変更する必要がありますMaybe
ではなくMaybeT
です。これはMaybeT . return
で生Maybe a
値をラップ意味:
f :: T
f = do
x <- get
val <- lift $ do
val <- MaybeT $ return someMaybe
-- more code in Maybe monad
return 4
return 3
あなたはおそらくliftMaybe
のような機能を書きたいので、これは、少しぎこちないです:
liftMaybe = MaybeT . return
あなたが他にIO a
値を持ち上げるためにlift
を使用した場合あなたのコードの一部を削除します。なぜなら、今あなたのトランススタックに3つのレベルがあるからです。
Couldn't match expected type `MaybeT IO t0'
with actual type `IO String'
これを修正するには、すべてのあなたの生IO a
の値についてliftIO
を使用する必要があります:あなたはこのようになりますエラーが発生します。これは、任意の数のトランスレイヤーを介して動作するために、タイプメッシュを使用します(IO
)。あなたのコメントを受けて
:
let maybeVal = do val <- someMaybe
-- more Maybe code
return 4
case maybeVal of
Just res -> ...
Nothing -> ...
:あなただけMaybe
に応じて、コードのビットを持っている場合、ちょうどそれに対する変数と試合do
表記の結果を置くために容易になるだろうつまり、コードMaybe
はIOを実行できません。また、case
の代わりにfromMaybe
のような機能を使用することもできます。あなたは純粋にMaybe
モナドにおける内do
でコードを実行したい場合は
私はこのモナドで動作するたくさんの関数を持っていますが、それらのうちの1つでは、 'Maybe'からいくつかの値をアンパックする必要があり、' do'表記を使用するとネストされた 'case' expereionを取り除くことができます。タイプを定義することはこれを行う唯一の方法ですか? – Adrian
もちろん、 'MaybeT'トランスを使用するブロックに対して' runMaybeT'を使うこともできます。 – dflemstr
@Adrian: 'do'表記をそれ自身の関数に抽出して、それと一致する単一のcase式を持つことができます。実際、これがおそらく最善のアプローチです。しかし、あなたはモナド変圧器をもっと理解するために私のバージョンでちょっと遊んでください。 –
、あなたは(良いことかもしれません)StateT Int
またはIO
モナドにアクセスすることはできません。あなたが唯一の `Maybe`モナドで実行するためのインナー` do`にコードをしたいか、またはそれは `にアクセスする必要があるん
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Trans.State
type T = StateT Int IO Int
someMaybe = Just 3
f :: T
f = do
x <- get
-- no need to use bind
let mval = do
-- this code is purely in the Maybe monad
val <- someMaybe
-- more code in Maybe monad
return 4
-- scrutinize the resulting Maybe value now we are back in the StateT monad
case mval of
Just val -> liftIO . putStrLn $ "I got " ++ show val
Nothing -> liftIO . putStrLn $ "I got a rock"
return 3
- 1. 簡素化は、たぶん私は、次のコードを持っている
- 2. 、私は次のコードを持っている変数のショートカットに
- 3. Plotdevice、私は次のコードを持っている変数
- 4. 私は次のコードで変更したXMLファイル持って
- 5. 私は、次のPHPコードを持っている私のデータベース
- 6. は、私は次のコードを持っているエンティティの作成
- 7. は、私は次のコードを持っているのPython
- 8. は、私は次のコードを持っているjQueryのコールバック
- 9. は、私は、次のコードを持っているJavaの
- 10. アレイのFileInfo []は、私は次のコードを持っているファイル
- 11. のSQLite Pythonは、私は次のコードを持っているテーブル
- 12. は、私はPythonで、次のコードを持っているNode.jsの
- 13. は、プログラム私は次のコードを持っているのDataTable
- 14. は、私は次のコードを持っているwxPythonの
- 15. jQueryのは、私は次のコードを持っている
- 16. は、私は次のコードを持っているのコンストラクタ
- 17. ( ")私は次のコードを持っているはずのjQuery
- 18. のClojure(アレフ)サーバーは、私は次のコードを持っている
- 19. は、私は次のコードを持っているJavaの
- 20. Haskellは、私は次のコードを持っているのInt
- 21. はい、私は次のHTMLコード/構造持って、私はテーブル
- 22. は、私は、次のコードを持っている文字列
- 23. は、私は、次のJavaScriptコードを持っている未定義
- 24. JavaScriptは、私は次のコードを持っている属性
- 25. は、私はセイロンに次のコードを持っているセイロン
- 26. は、私は、VBに次のコードを持っているC#
- 27. は、私は、次のコードを持っている配列
- 28. は、私は次のコードを持っている機能
- 29. CookieAuthenticationOptions、ExpireTimeSpanは、私は次のコードを持っている
- 30. は、私は次のコードを持っているMVCアプリ
:そうすることであなたは精査する必要があります
Maybe
値を返しますStateT Int'と 'IO'もそうですか? – pat'Maybe'モナドのみ。 – Adrian