Lens、Conduit、および Monad-Loops を利用する次の Haskell コードを検討してください。
type Broadcast = Int
type BroadcastChan = TChan Broadcast
data SessionState = SessionState
{ _broadcastChan :: BroadcastChan
}
makeLenses ''SessionState
type Session m = StateT SessionState m
type SessionIO = Session IO
-- This function requires the state and IO...
processBroadcast :: Broadcast -> Conduit Broadcast SessionIO Packet
processBroadcast = undefined
-- | Handles networking
protocol :: Conduit Packet SessionIO Packet
protocol = do
ch <- lift $ use broadcastChan
-- line 51:
whileJust_ (liftIO . atomically $ tryReadTChan ch) (\x -> yield $ processBroadcast x)
liftIO $ putStrLn "End"
大量のリフティングを通じて、次の型エラーを解決できませんでした。
src\Burrito\Network.hs:51:61:
Couldn't match expected type `Packet'
with actual type `Conduit Broadcast SessionIO Packet'
Expected type: ConduitM Packet Packet SessionIO b0
Actual type: ConduitM
Packet (Conduit Broadcast SessionIO Packet) m0 ()
In the expression: yield $ processBroadcast x
In the second argument of `whileJust_', namely
`(\ x -> yield $ processBroadcast x)'
いくつかのガイダンスやアドバイスをいただければ幸いです。processBroadcast
処理のためにセッションによって運ばれる状態が必要であることに注意してください。
モナドループのドキュメント: http://hackage.haskell.org/packages/archive/monad-loops/0.4.2/doc/html/Control-Monad-Loops.html
コンジット ドキュメント: http://hackage.haskell.org/packages/archive/conduit/1.0.6/doc/html/Data-Conduit.html
stm (TChannel) ドキュメント: http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TChan.html