2017-02-28 5 views
4

私はHaskellの初心者です& Yesodと私はControl.Concurrent.Asyncモジュールを使って非同期の処理をしようとしています。 (コードはに基づいています:https://hackage.haskell.org/package/async-2.1.1/docs/Control-Concurrent-Async.html#v:withAsync):Yesod、withAsync

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

そこで問題は、私が間違って何をやっているされて

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") 

しかし、これは次のエラーを生成しますか?

答えて

5

非同期パッケージ内のAPIは、の単一形です。つまり、IOのアクションでのみ動作します。代わりにWidgetT変圧器タイプで使用しようとしています。これは、エラーメッセージの出所です。 lifted-asyncパッケージを使用すると、withAsync関数の多型を提供します。

  1. インポートControl.Concurrent.Async.Lifted
  2. あなたbuild-depends
lifted-asyncを追加します。ほとんどの部分については、これは単なる問題のあるべき