如何在Haskell中从monad中取出一个值?

Ill*_*iax 12 monads haskell

有没有办法从单子中取出"东西"?

我正在开发一款游戏,现在我正在尝试了解数据库.我发现happstack非常好,但我无法得到这个东西.

例如,我有这个功能(希望你熟悉happstack)

getAllThings :: MonadIO m => m [Thing]
getAllThings = do
            elems <- query GetThings
            return elems
Run Code Online (Sandbox Code Playgroud)

所以我明白了m [Things],但我不能在我的模型中使用它!例如

doSomeThingWithThings :: [Thing] -> Something
Run Code Online (Sandbox Code Playgroud)

我用Google搜索了一下,但我一无所获.

bra*_*vit 17

您不应该以这种方式退出IO monad(unsafePerformIO函数除外),但您仍然可以在其中使用您的函数:

process :: MonadIO m => m ()
process = do
          elems <- getAllThings
          let smth = doSomeThingWithThings elems
          -- ...
Run Code Online (Sandbox Code Playgroud)

  • 您可以这样想:您的整个程序都是IO monad,而您的模型是一系列在其中执行的纯函数. (6认同)