[英]Mixing Coroutines and Websockets in PureScript
这与试图将WebSocket的输入和输出连接到协程有关。
以下函数获取一个Connection
然后将其设置为在收到消息时emit
Coroutine值。
module Main where
import Prelude
import Control.Coroutine (emit, Producer, Consumer, await)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Eff.Var (($=))
import Control.Monad.Reader.Trans (lift)
import Control.Monad.Rec.Class (forever)
import WebSocket (WEBSOCKET, Connection(..), newWebSocket, URL(..), runMessage, runMessageEvent)
wsProducer :: Connection → Producer String (Eff _) Unit
wsProducer (Connection s) = s.onmessage $= emit <<< runMessage <<< runMessageEvent
Producer
和Consumer
将被连接在Main
(WebSocket连接也将在此处建立),但尚未编写,因为上面的函数甚至不会进行类型检查。
请问如何进行类型检查? 它不会进行类型检查的事实可能意味着上面的代码中存在基本的误解,如果这样的话,对有效解决方案的代码示例进行解释将非常有帮助。
相关: 有关Halogen和WebSockets的答案包含非常相似的代码。
该代码段有几处错误。 首先,这是一个有效的版本:
module Main where
import Prelude
import Control.Coroutine (Producer)
import Control.Coroutine.Aff (produce)
import Control.Monad.Aff (Aff)
import Control.Monad.Aff.AVar (AVAR)
import Control.Monad.Eff.Var (($=))
import Data.Either (Either(..))
import WebSocket (WEBSOCKET, Connection(..), runMessageEvent, runMessage)
wsProducer :: forall eff. Connection → Producer String (Aff (avar :: AVAR, ws :: WEBSOCKET | eff)) Unit
wsProducer (Connection s) =
produce \emit ->
s.onmessage $= emit <<< Left <<< runMessage <<< runMessageEvent
produce
,这是什么使emit
到的范围,并且是你如何做一个制片人。 Aff
而不是Eff
。 emit
接受Either
一个Left
值指示应该生成一个值,一个Right
指示生产者应该关闭。 看看produce
的文档 ,希望您提到的误解会变得清楚!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.