Haskell 导管单子whileJust_uuuu问题
考虑以下使用镜头、导管和Monad循环的Haskell代码:Haskell 导管单子whileJust_uuuu问题,haskell,monads,conduit,Haskell,Monads,Conduit,考虑以下使用镜头、导管和Monad循环的Haskell代码: type Broadcast = Int type BroadcastChan = TChan Broadcast data SessionState = SessionState { _broadcastChan :: BroadcastChan } makeLenses ''SessionState type Session m = StateT SessionState m type SessionIO = Ses
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"
如能提供一些指导或建议,将不胜感激。请记住,processBroadcast
需要会话为其处理所携带的状态
- 单子循环文档:
- 管道文件:
- stm(TChan)文件:
import Control
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 a SessionIO Packet
processBroadcast b = undefined
-- | Handles networking
protocol :: Conduit Packet SessionIO Packet
protocol = do
ch <- lift $ use broadcastChan
-- line 51:
whileJust_ (liftIO . atomically $ tryReadTChan ch) processBroadcast
liftIO $ putStrLn "End"
导入控制
类型广播=Int
类型BroadcastChan=TChan广播
数据会话状态=会话状态
{u broadcastChan::broadcastChan
}
“会话状态”
类型Session m=StateT SessionState m
键入SessionIO=SessionIO
--此函数需要状态和IO。。。
processBroadcast::Broadcast->引导会话数据包
processBroadcast b=未定义
--|处理网络
协议::导管数据包sessiono数据包
协议=do
更进一步,我做了一些研究,正确的类型别名应该是->Producer SessionIO Packet
。谢谢
import Control
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 a SessionIO Packet
processBroadcast b = undefined
-- | Handles networking
protocol :: Conduit Packet SessionIO Packet
protocol = do
ch <- lift $ use broadcastChan
-- line 51:
whileJust_ (liftIO . atomically $ tryReadTChan ch) processBroadcast
liftIO $ putStrLn "End"