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
的Producer
和Consumer
將在Main
(WebSocket的連接也將做出有)被鉤住了,還沒有被寫入尚未雖然,因爲上面的函數甚至不會類型檢測。
請問這是怎麼做出來的?它不會檢測的事實可能意味着在上面的代碼中存在根本性的誤解,如果是這樣的話,對工作解決方案的代碼示例的解釋會非常有幫助。
相關:this answer about Halogen and WebSockets包含非常相似的代碼。
我想知道我是否應該使用'produce'。我正在關注[purescript-coroutines文檔](https://pursuit.purescript.org/packages/purescript-coroutines/2.0.1),參見'nats'函數,它使用'emit'但不使用' produce'。文件中不清楚在什麼情況下應該使用什麼,在有副作用時應該使用「產生」? – user4301448
這段代碼的工作原理(我主要得到解釋),非常感謝。我擔心我沒有足夠的代表。以滿足您的答案,但我已將其標記爲接受的答案。 – user4301448
啊對,是的 - 'produce'是'-aff-coroutines'的一部分,當你與某種有效的製作人一起工作時。 '-coroutines'只能處理一般的情況,對於基本的monad沒有任何意見。如果你在你所指的文檔中注意到,'Producer'中的'm'完全沒有指定(除了'Monad'約束),因爲它是純粹的 - 它只是引入'Eff'的消費者,在那裏使用'log'。在這種情況下,我們必須做一些有效的事情,才能使「生產者」變得更加有效,因此需要像'produce'這樣的東西。 –