2011-09-06 52 views
11

有沒有辦法從monad中取出「東西」?如何從Haskell中的monad中取出一個值?

我正在開發一款遊戲,現在我正在嘗試瞭解數據庫。我發現happstack真的很好,但我無法得到的東西。

例如,我有這個功能(希望你熟悉happstack

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

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

doSomeThingWithThings :: [Thing] -> Something 

我使用了這個,我什麼也沒找到。

+2

您可以享受[我的意見以假想'magicMonadUnwrap'](http://stackoverflow.com/questions/7154518/unwrapping-a-monad/7156230#7156230)(回答一個類似的StackOverflow問題) –

回答

16

你不應該退出IO單子這種方式(除unsafePerformIO功能),但你仍然可以使用你的函數內部它:

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

你可以這樣想:你的整個程序是IO monad ,而你的模型是一堆在它內部執行的純函數。 – bravit

+0

是的!在重新思考我的問題和答案之後,我明白它必須是這種方式!我的遊戲是(如你所說)純函數,但用戶界面是真正醜陋的世界,所以持久性部分也必須是! – Illiax

2

elems <- query GetThings的elems的是[Thing]所以<-裏面做的是關於讓monad以外的東西(稱爲綁定操作)。最後的陳述return把東西放在monad裏面。所以,要麼你可以得到elems的後return前或是在你打電話等功能以往任何時候都在呼喚getAllThings您可以使用提取使用<-從單子的價值,並把它傳遞給你的函數