2017-02-28 88 views
4

我是一個新手,哈斯克爾&耶索德,我嘗試使用Control.Concurrent.Async模塊做的東西異步。 (該代碼是基於:https://hackage.haskell.org/package/async-2.1.1/docs/Control-Concurrent-Async.html#v:withAsync耶索德,withAsync

quizWidget = do 
    --Get first question 
    withAsync (showQuizItem 1 1) $ \qi -> do 
    withAsync (showScoreboard) $ \sb -> do 

    quizItem <- wait (qi) 
    scoreboard <- wait (sb) 

    toWidget $(hamletFile "hamlet/quiz.hamlet") 

但是,這會產生以下錯誤:

"No instance for (MonadWidget IO) arising from a use of ‘toWidget’".

所以,問題是我究竟做錯了什麼?

回答

5

async包中的API是單形,這意味着它僅適用於IO中的動作。你試圖在WidgetT變壓器類型,而不是,這是在錯誤消息是來自使用它。您可以使用lifted-async包,它提供了withAsync功能的多態性變異。在大多數情況下,這應該只是一個問題的:

  1. 進口Control.Concurrent.Async.Lifted
  2. 添加lifted-asyncbuild-depends