特に、私は...あなたが欲しいんハスケルではどのようにモナドを組み合わせるのですか?
答えて
どのような意味ではIOモナドでCGIモナドを組み合わせることができるようにする必要がありますが、たぶんモナドも良いかもしれないとIOモナドを組み合わせた方法の例モナドを組み合わせる?
f :: Int -> IO (Maybe Int)
f x = do
putStrLn "Hello world!"
return $ if x == 0 then Nothing else Just x
をするために評価することができる:
[1 of 1] Compiling Main (maybe-io.hs, interpreted)
Ok, modules loaded: Main.
*Main> f 0
Hello world!
Nothing
*Main> f 3
Hello world!
Just 3
あなたはMaybe上で計算を構成していないので、Maybeがモナドであるという事実は無関係です。 – jrockway
あなたは正確にあなたがIO
とMaybe
を結合する方法を言うことはありませんが、私はあなたが簡単に結合したいIO (Maybe a)
を返す多くの機能を持っていると仮定します。基本的にあなたがそれ自身のMonad
インスタンスと別の型としてIO (Maybe a)
を扱いたい:これにより
newtype IOMaybe a = IOM (IO (Maybe a))
-- "unpack" a value of the new type
runIOMaybe :: IOMaybe a -> IO (Maybe a)
runIOMaybe (IOM a) = a
instance Monad IOMaybe where
-- bind operator
(IOM ioa) >>= f = IOM $ do
a <- ioa
case a of
Nothing -> return Nothing
Just v -> runIOMaybe (f v)
-- return
return a = IOM (return (Just a))
-- maybe also some convenience functions
returnIO :: IO a -> IOMaybe a
returnIO ioa = IOM $ do
v <- ioa
return (Just v)
returnMaybe :: Maybe a -> IOMaybe a
returnMaybe ma = IOM (return ma)
あなたがIO (Maybe a)
、IO a
またはMaybe a
を返す関数を組み合わせることdo
-Notationを使用することができます。
f1 :: Int -> IO (Maybe Int)
f1 0 = return Nothing
f1 a = return (Just a)
main = runIOMaybe $ do
returnIO $ putStrLn "Hello"
a <- returnMaybe $ Just 2
IOM $ f1 a
return()
一般的に、このようなモナドを組み合わせて変更するものはmonad transformerと呼ばれ、GHCには一般的なケースのモナドトランスを含むpackageが付属しています。あなたのシナリオに合ったこのモナド・トランスフォーマー・ライブラリーに何かがある場合は、MaybeとIOをどのように組み合わせたいかによって決まります。
あなたが気づいていなかった場合は、 'newtype IOMaybe a = IOM {runIOMaybe :: IO(Maybe a)}'を宣言することによって自動的に 'runIOMaybe'を作成することができます。 – rovaughn
早起きのためにMaybeモナドを使用することを前提としています(break
またはreturn
、C言語)。
この場合、MaybeTパッケージ(cabal install MaybeT
)のMaybeT
を使用する必要があります。
main = do
runMaybeT . forever $ do
liftIO $ putStrLn "I won't stop until you type pretty please"
line <- liftIO getLine
when ("pretty please" == line) mzero
return()
多分、モナモードのモナドトランスバージョンです。
モナドトランスは、他のモナドに「機能を追加」します。
また、mtlにErrorTがあること、 MonadPlusを実装しています。つまり、上記のコードはErrorモナドではほとんど変わりません。 (変更は、ErrorTの "Left"部分にタイプシグネチャが必要であるということです。 "mzero"はあまり具体的ではありません)。 – jrockway
@jrockway:左のタイプには、エラーのインスタンスが必要です。これは少し不便です'MaybeT'は実際には' ErrorT() 'のような同形ですが、'インスタンスError() 'がないのでこれは許されません。 'EitherT'を使う方が良いでしょうが、これには追加のパッケージも必要です。 –
- 1. ハスケル!!演算子の組み合わせ
- 2. ハスケルの組み合わせと置換
- 3. ハスケル:組み合わせ(リストのリスト)
- 4. CheckingFuelMonadとHooplのStateモナドを組み合わせるにはどうすればいいですか?
- 5. vimで "Ctrl +>"をどのように組み合わせるのですか?
- 6. WebDriverとScottyのモナドを組み合わせる方法
- 7. 角度、どのように組み合わせるかのモジュール
- 8. Pythonでどのように組み合わせるのですか?
- 9. `.findAllAsync()。asObservable()`と `copyFromRealm`をどのように組み合わせるのですか?
- 10. Javascriptで2つのオブジェクトをどのように組み合わせますか?
- 11. どのようにPHPで配列を組み合わせるには?
- 12. 列の組み合わせの組み合わせデータフレームの行ではない
- 13. null値はどのように組み合わせるかの列にあり
- 14. 多分組み合わせ、配列モナド:出力
- 15. シンボルの組み合わせはどのように生成されますか?
- 16. これらのxpath式はどのように組み合わせますか?
- 17. どのようにしてアレイとマップを組み合わせ、それと何かを組み合わせるのですか?
- 18. どのようにモノイド型の配列を組み合わせるには?
- 19. どのように2つのニューラルネットワークを組み合わせるには?
- 20. Scalaz - リストと州のモナドを組み合わせて理解する
- 21. Python itertoolsの組み合わせの組み合わせ
- 22. 2つのクエリtogatherをどのように組み合わせるか?
- 23. 複数のモデルをどのように組み合わせるか?
- 24. 2つのスクリプトをどのように組み合わせるか?
- 25. 2つのNode.jsアプリケーションサーバーをどのように組み合わせるか。
- 26. どのようにhaskellパターンマッチを効率的に組み合わせるか
- 27. 2つのルールを1つのXACMLで組み合わせるにはどうすればよいですか?
- 28. ブーストジオメトリトランスを2つ組み合わせるにはどうすればいいですか?次のように
- 29. テラフォームのフォーマットリストとコンカットをどのように組み合わせますか?
- 30. Tomcat 5.5との組み合わせでログバックアクセスを使用するにはどうすればよいですか?
おもしろい読んでください:[Monad_transformers](http://www.haskell.org/haskellwiki/Typeclassopedia#Monad_transformers) – mb21