特别是,我需要能够组合CGI monad和IO monad,但如何组合IO monad和可能monad的示例可能会更好……
发布于 2009-07-14 20:06:23
我假设您想要使用“可能单子”来提前终止(就像C中的break
或return
)。
在这种情况下,您应该使用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 ()
MaybeT是可能monad的monad transformer版本。
Monad转换器向其他Monad“添加功能”。
发布于 2009-07-14 18:49:27
您并没有确切地说出希望如何组合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)
这样,您就可以使用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的东西被称为monad transformer,GHC附带了一个package,其中包括常见情况下的monad转换器。这个monad transformer库中是否有适合您的场景的内容取决于您想要如何准确地组合Maybe和IO。
发布于 2009-07-14 16:57:25
您希望在什么意义上组合这些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
https://stackoverflow.com/questions/1126651
复制相似问题