2017-02-28 4 views
4

Ich bin ein Neuling zu Haskell & Yesod und ich versuche, das Control.Concurrent.Async Modul zu verwenden, um Async Sachen zu tun. (Der Code basiert auf: https://hackage.haskell.org/package/async-2.1.1/docs/Control-Concurrent-Async.html#v:withAsync)Yesod, 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") 

Aber das erzeugt den folgenden Fehler:

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

Die Frage ist also, was mache ich falsch?

Antwort

5

Die API im asynchronen Paket ist monomorph, was bedeutet, dass sie nur für Aktionen in IO funktioniert. Sie versuchen, es stattdessen in dem Transformer-Typ WidgetT zu verwenden, von dem die Fehlermeldung stammt. Sie können das lifted-async-Paket verwenden, das eine polymorphe Variante der withAsync-Funktion bereitstellt. Zum größten Teil sein, sollte dies nur eine Frage der:

  1. Import Control.Concurrent.Async.Lifted
  2. hinzufügen lifted-async zu Ihrem build-depends