特別是,我需要能夠將CGI monad與IO monad結合起來,但是如何將IO monad與Maybe monad結合使用的示例可能會更好...如何在Haskell中組合monads?
回答
您希望在什麼意義上結合monads?
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
您不是正在撰寫可能的計算,因此,可能是monad的事實是不相關的。 – jrockway 2009-09-23 07:38:51
你並不確切地說,你怎麼想結合IO
和Maybe
,但我相信你有許多功能,包括返回IO (Maybe a)
要輕鬆組合。基本上,你要正確對待IO (Maybe a)
作爲一個單獨的類型有它自己的Monad
例如:
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)
有了這個,你可以使用do
-Notation結合返回IO (Maybe a)
,IO a
或Maybe a
功能:
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,其中包括常見情況下的單子變換器。如果在這個monad轉換器庫中有些東西符合你的方案,取決於你想要如何組合Maybe和IO。
如果您不知道,您可以通過改爲聲明`newtype IOMaybe a = IOM {runIOMaybe :: IO(也許a)}'來自動創建`runIOMaybe`` – rovaughn 2011-05-12 20:38:31
我假設你想使用Maybe monad來提前終止(如C中的break
或return
)。
在這種情況下,您應該使用MaybeT包中的MaybeT
(cabal install 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()
MaybeT是可能monad的monad變壓器版本。
Monad變壓器「添加功能」給其他monad。
也不值得在mtl中有ErrorT,實現了MonadPlus,這意味着上述代碼在Error monad中幾乎不會改變。 (這個變化是ErrorT的「Left」部分需要一個類型簽名,因爲「mzero」不夠具體。) – jrockway 2009-09-23 07:37:46
- 1. 在Haskell中合併monads
- 2. Haskell中的State Monads
- 3. 在Haskell中循環Monads
- 4. Haskell,IO,monads,quickcheck
- 5. Monads在haskell中傳遞變量
- 6. Haskell類型簽名和Monads
- 7. Haskell:非IO monads中的異常處理
- 8. 如何在Haskell中添加一個字符串到Monads列表中
- 9. Monads在JavaScript中?
- 10. 如何調用函數並在haskell中返回不同的值? (W/o monads)
- 11. Haskell:如何處理大組合列表?
- 12. Haskell函數組合
- 13. 如何在Haskell中組合列表和狀態Monad
- 14. 如何在Haskell中組合兩個列表
- 15. 在哈斯克爾混合Monads
- 16. 使用monads的Haskell中while循環的示例
- 17. 是monads表達式,還是Haskell中有語句?
- 18. 順序monads中優雅的haskell case /錯誤處理
- 19. Haskell複雜函數組合
- 20. Haskell多功能組合
- 21. Haskell函數組合方法
- 22. Haskell - 組合數據類型?
- 23. Haskell語法:函數如何組合在一起?
- 24. 如何合併兩張地圖在Haskell
- 25. 合併monads(IEnumerable和Maybe作爲示例)
- 26. Haskell:如何比較元組?
- 27. 使用Monads變壓器堆疊Monads
- 28. 如何在組合框中
- 29. 如何在Scala中組合
- 30. 如何從一個元組在Haskell
有趣的閱讀:[Monad_transformers](http://www.haskell.org/haskellwiki/Typeclassopedia#Monad_transformers) – mb21 2013-05-15 14:33:01