2016-09-25 44 views
0

這是關於試圖將WebSocket的輸入和輸出連接到協程。在PureScript中混合協程和Websocket

以下函數接收Connection,然後將其設置爲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 

ProducerConsumer將在Main(WebSocket的連接也將做出有)被鉤住了,還沒有被寫入尚未雖然,因爲上面的函數甚至不會類型檢測。

請問這是怎麼做出來的?它不會檢測的事實可能意味着在上面的代碼中存在根本性的誤解,如果是這樣的話,對工作解決方案的代碼示例的解釋會非常有幫助。

相關:this answer about Halogen and WebSockets包含非常相似的代碼。

回答

3

這段代碼有一些錯誤。首先,這裏是可用的版本:

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 - a Left值表示應該生成一個值,而Right表示生產者應該關閉。

看一看at the docs for produce希望你提到的誤解會變得清晰!

+0

我想知道我是否應該使用'produce'。我正在關注[purescript-coroutines文檔](https://pursuit.purescript.org/packages/purescript-coroutines/2.0.1),參見'nats'函數,它使用'emit'但不使用' produce'。文件中不清楚在什麼情況下應該使用什麼,在有副作用時應該使用「產生」? – user4301448

+0

這段代碼的工作原理(我主要得到解釋),非常感謝。我擔心我沒有足夠的代表。以滿足您的答案,但我已將其標記爲接受的答案。 – user4301448

+1

啊對,是的 - 'produce'是'-aff-coroutines'的一部分,當你與某種有效的製作人一起工作時。 '-coroutines'只能處理一般的情況,對於基本的monad沒有任何意見。如果你在你所指的文檔中注意到,'Producer'中的'm'完全沒有指定(除了'Monad'約束),因爲它是純粹的 - 它只是引入'Eff'的消費者,在那裏使用'log'。在這種情況下,我們必須做一些有效的事情,才能使「生產者」變得更加有效,因此需要像'produce'這樣的東西。 –