考慮利用鏡頭,管道和單子,循環以下Haskell代碼:管道單子whileJust_問題
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
要求狀態由Session進行處理。
單子 - 環文檔: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(TChan)文檔: http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TChan.html
51行標記。 – kvanberendonck