Haskell 导管单子whileJust_uuuu问题

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

考虑以下使用镜头、导管和Monad循环的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"
如能提供一些指导或建议,将不胜感激。请记住,
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"