이것은 WebSocket의 입출력을 코 루틴에 연결하려는 시도와 관련이 있습니다.PureScript에서 코 루틴과 웹 소켓을 섞음
다음 함수는 메시지를 수신 할 때 emit
Coroutine 값으로 설정합니다.이 함수는 Connection
입니다.
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
에 부착해야한다.
어떻게 형체 검사를 할 수 있습니까? typecheck하지 않는다는 사실은 위의 코드에서 근본적인 오해가 있음을 의미 할 수 있습니다. 그렇다면 작업 솔루션의 코드 샘플에 대한 설명이 도움이 될 것입니다.
관련 : this answer about Halogen and WebSockets은 매우 유사한 코드를 포함합니다.
'생산'을 사용해야하는지 궁금합니다. 나는 [purescript-coroutines documentation] (https://pursuit.purescript.org/packages/purescript-coroutines/2.0.1)을 따르고 있었고,'emit'을 사용하지만' 생산한다. 문서에서 어떤 상황에서 사용해야하는지 명확하지 않으며, 부작용이있을 때'생산 '해야합니까? – user4301448
이 코드는 작동합니다 (대부분 설명을 얻습니다). 고맙습니다. 나는 충분한 담당자가없는 것이 아닌가 걱정된다. 귀하의 답변을 upvote하지만 난 그것이 허용 대답으로 표시했습니다. – user4301448
아 맞아, 네 -'생산물'은'--aff-coroutines'의 일부입니다. 이것은 당신이 어떤 종류의 효과있는 생산자와 일할 때를위한 것입니다. '-coroutines'는 일반적인 경우 만 처리하고 기본 모나드에 대해서는 의견이 없습니다. 당신이 언급했던 문서에서 주목한다면,'m'은'Monad' 제약을 제외하고''생산자 ''는 순수하기 때문에 완전히 지정되지 않은 채로 남아 있습니다.''Eff'가 도입 된 소비자 일뿐입니다. 거기에'log'를 사용합니다. 이 경우 '생산자'를 평등하게 만들기 위해서는 효과가 있어야하므로 '생산'과 같은 것이 필요합니다. –