在PureScript中混合协同路由和WebSocket

在PureScript中混合协同路由和WebSocket,websocket,purescript,Websocket,Purescript,这是关于尝试将WebSocket的输入和输出连接到协同程序 以下函数接受一个连接,然后在收到消息时将其设置为emit一个协同路由值 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 Contr

这是关于尝试将WebSocket的输入和输出连接到协同程序

以下函数接受一个
连接
,然后在收到消息时将其设置为
emit
一个协同路由值

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
modulemain其中
进口序曲
进口控制。协同程序(排放、生产者、消费者、等待)
进口控制.Monad.Eff(Eff)
导入Control.Monad.Eff.Console(控制台,日志)
导入控制.Monad.Eff.Var($=)
导入控制.Monad.Reader.Trans(提升)
导入控制.Monad.Rec.Class(永远)
导入WebSocket(WebSocket,连接(..),newWebSocket,URL(..),runMessage,runMessageEvent)
wsProducer::连接→ 生产者串(效率)单元

wsProducer(Connection s)=s.onmessage$=emit该代码段有几处错误。首先,这里有一个有效的版本:

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
modulemain其中
进口序曲
进口管制.合作程序(生产商)
导入控制.Coroutine.Aff(生产)
进口控制单体Aff(Aff)
进口管制.Monad.Aff.AVar(AVar)
导入控制.Monad.Eff.Var($=)
导入数据。或者(或者(…)
导入WebSocket(WebSocket,连接(..),runMessageEvent,runMessage)
wsProducer::forall eff。联系→ 生产者字符串(Aff(avar::avar,ws::WEBSOCKET | eff))单位
WSS生产者(连接)=
产生\emit->

s、 onmessage$=emit该代码段有几个地方出错。首先,这里有一个有效的版本:

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
modulemain其中
进口序曲
进口管制.合作程序(生产商)
导入控制.Coroutine.Aff(生产)
进口控制单体Aff(Aff)
进口管制.Monad.Aff.AVar(AVar)
导入控制.Monad.Eff.Var($=)
导入数据。或者(或者(…)
导入WebSocket(WebSocket,连接(..),runMessageEvent,runMessage)
wsProducer::forall eff。联系→ 生产者字符串(Aff(avar::avar,ws::WEBSOCKET | eff))单位
WSS生产者(连接)=
产生\emit->

s、 onmessage$=emit我想知道是否应该使用
product
。我正在遵循,请参见
nats
函数,它使用
emit
,但不使用
product
。文档中根本不清楚在什么情况下应该使用什么,当出现副作用时应该使用
生产
?此代码有效(我大部分都得到了解释),非常感谢。恐怕我没有足够的代表投票支持你的答案,但我已将其标记为已接受的答案。啊,是的,
制作
-aff合作计划
的一部分,该计划适用于你与某种有效的制作人合作时
-coroutines
只处理一般情况,对底层monad没有任何意见。如果您在参考的文档中注意到,
m
Producer
中完全未指定(除了
Monad
约束),因为它是纯的-由于在其中使用了
log
,只有消费者引入了
Eff
。在这种情况下,我们必须做一些有效的事情,才能使
生产者
更加公平,因此需要像
生产者
这样的东西,所以理论上,当你需要它时,你可以自己重新实现它(它是一些
AVar
用法之上的一层薄薄的一层),但它有点棘手,而且是一个相当常见的用例,这就是它作为自己的库存在的原因。太棒了@gb.,谢谢你的澄清。我希望这一切也能帮助其他人。我想知道我是否应该使用
product
。我正在遵循,请参见
nats
函数,它使用
emit
,但不使用
product
。文档中根本不清楚在什么情况下应该使用什么,当出现副作用时应该使用
生产
?此代码有效(我大部分都得到了解释),非常感谢。恐怕我没有足够的代表投票支持你的答案,但我已将其标记为已接受的答案。啊,是的,
制作
-aff合作计划
的一部分,该计划适用于你与某种有效的制作人合作时
-coroutines
只处理一般情况,对底层monad没有任何意见。如果您在参考的文档中注意到,
m
Producer
中完全未指定(除了
Monad
约束),因为它是纯的-由于在其中使用了
log
,只有消费者引入了
Eff
。在这种情况下,我们必须做一些有效的事情,才能使
生产者
更加公平,因此需要像
生产者
这样的东西,所以理论上,当你需要它时,你可以自己重新实现它(它是一些
AVar
用法之上的一层薄薄的一层),但它有点棘手,而且是一个相当常见的用例,这就是它作为自己的库存在的原因。太棒了@gb.,谢谢你的澄清。我希望这一切也能帮助别人。