有没有办法从单子中取出“东西”?
我正在开发游戏,现在我正在尝试了解数据库。我发现happstack
非常好,但我无法得到它。
例如,我有这个功能(希望你熟悉happstack
)
getAllThings :: MonadIO m => m [Thing]
getAllThings = do
elems <- query GetThings
return elems
所以我得到m [Things]
,但我不能在我的模型中使用它!例如
doSomeThingWithThings :: [Thing] -> Something
我用Google搜索了一下,但我一无所获。
答案 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中的<-
提取值并将其传递给你的函数