2016-10-25 10 views
0

websocketリクエスト内でDBクエリを実行しようとしています。それはthisの例の適応です。MonadHandlerを実行する必要がありますがSTMを返す

これを行うには、race_を作成しようとします。これには、DBにクエリするのに使用するMonadHandlerも含まれます。

handlerRace_ 
     (forever $ atomically (readTChan readChan) >>= sendTextData) 
     (sourceWS $$ mapM_C (\msg -> atomically $ do 
      users <- lift (runDB $ selectList [] [] :: Handler [Entity User]) -- query the DB 
      writeTChan writeChan $ msg 
     )) 

handlerRace_ :: (MonadBaseControl IO m, MonadHandler m) => m a -> m b -> m() 
handlerRace_ = race_ 

とエラー:これは、次の非作業コードと結果

Couldn't match type ‘t0 (HandlerT App IO)’ with ‘STM’ 
Expected type: STM [Entity User] 
    Actual type: t0 (HandlerT App IO) [Entity User] 
In a stmt of a 'do' block: 
    users <- lift (runDB $ selectList [] [] :: Handler [Entity User]) 

答えて

1

は、たぶん私は(完成されていないコード例)何かが足りないのですが、なぜただ単に上atomicallyを入れませんwriteTChan、これはSTM(未テスト)を使用するための意図であるように:

handlerRace_ 
    (forever $ atomically (readTChan readChan) >>= sendTextData) 
    (sourceWS $$ mapM_C (\msg -> do 
     users <- lift (runDB $ selectList [] [] :: Handler [Entity User]) -- query the DB 
     atomically $ writeTChan writeChan msg 
    )) 
+0

私のああ、私は初心者であること嫌い - 愚かな過ちを...ありがとう! :) また、私はそれを出したら、私は特別な 'race_'を必要としません – amitaibu

+1

ハスケルは時間がかかる心配しないでください! – MichaelO

関連する問題