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

时间:2011-09-06 04:02:07

标签: haskell monads

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

我正在开发游戏,现在我正在尝试了解数据库。我发现happstack非常好,但我无法得到它。

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

getAllThings :: MonadIO m => m [Thing]
getAllThings = do
            elems <- query GetThings
            return elems

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

doSomeThingWithThings :: [Thing] -> Something

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

2 个答案:

答案 0 :(得分:16)

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

process :: MonadIO m => m ()
process = do
          elems <- getAllThings
          let smth = doSomeThingWithThings elems
          -- ...

答案 1 :(得分:2)

elems <- query GetThings之后的元素是[Thing]所以<-里面的内容是关于从monad中取出东西(称为绑定操作)。最后一个语句return将内容置于monad中。因此,你可以在获得elems之后和return之前或者你正在调用getAllThings之前调用其他函数,你可以使用monad中的<-提取值并将其传递给你的函数