繁体   English   中英

在PureScript中混合协程和Websocket

[英]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

ProducerConsumer将被连接在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
  1. 你缺少一个使用的produce ,这是什么使emit到的范围,并且是你如何做一个制片人。
  2. 生产者必须使用Aff而不是Eff
  3. emit接受Either一个Left值指示应该生成一个值,一个Right指示生产者应该关闭。

看看produce的文档 ,希望您提到的误解会变得清楚!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM