首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Haskell中组合monads?

如何在Haskell中组合monads?
EN

Stack Overflow用户
提问于 2009-07-14 16:47:06
回答 3查看 6K关注 0票数 19

特别是,我需要能够组合CGI monad和IO monad,但如何组合IO monad和可能monad的示例可能会更好……

EN

回答 3

Stack Overflow用户

发布于 2009-07-14 20:06:23

我假设您想要使用“可能单子”来提前终止(就像C中的breakreturn )。

在这种情况下,您应该使用MaybeT包(cabal install MaybeT)中的MaybeT

代码语言:javascript
复制
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“添加功能”。

票数 22
EN

Stack Overflow用户

发布于 2009-07-14 18:49:27

您并没有确切地说出希望如何组合IOMaybe,但我假设您有许多返回IO (Maybe a)的函数,您希望轻松组合它们。基本上,您希望使用自己的Monad实例将IO (Maybe a)视为一个单独的类型:

代码语言:javascript
复制
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 aMaybe a的函数

代码语言:javascript
复制
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。

票数 17
EN

Stack Overflow用户

发布于 2009-07-14 16:57:25

您希望在什么意义上组合这些monads?

代码语言:javascript
复制
f :: Int -> IO (Maybe Int)
f x = do
    putStrLn "Hello world!"
    return $ if x == 0 then Nothing else Just x

可以评估为:

代码语言:javascript
复制
[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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1126651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档