1

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処理のためにセッションによって運ばれる状態が必要であることに注意してください。


4

1 に答える 1

2

これは機能します:

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"

関数 processBroadcast は単一のブロードキャストのみを処理するため (私はそれを想定していました)、コンジットの入力タイプを Broadcast に制限する必要はありません。プロトコルで使用するには、そのコンジットの入力タイプがプロトコル コンジットの入力タイプ (Packet) と一致する必要があるため、プロトコルでは、a in processBroadcast が Packet にインスタンス化されます。

于 2013-06-20T04:56:00.200 に答える