2016-09-25 1 views
0

이것은 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은 매우 유사한 코드를 포함합니다.

답변

3

해당 스 니펫에는 몇 가지 문제가 있습니다. 당신은 범위에 emit을 제공합니다, 당신은 프로듀서을 어떻게 무엇 produce의 사용을 놓치고

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. : 첫째, 여기에 작동하는 버전입니다.
  2. 제작자는 Eff이 아니라 Aff을 사용해야합니다.
  3. emit은 - 값이 생성되어야 함을 나타내는 값인 Left을 허용하고 Right은 생산자를 닫아야 함을 나타냅니다.

at the docs for produce을 살펴보고 언급 한 오해가 명확 해집니다.

+0

'생산'을 사용해야하는지 궁금합니다. 나는 [purescript-coroutines documentation] (https://pursuit.purescript.org/packages/purescript-coroutines/2.0.1)을 따르고 있었고,'emit'을 사용하지만' 생산한다. 문서에서 어떤 상황에서 사용해야하는지 명확하지 않으며, 부작용이있을 때'생산 '해야합니까? – user4301448

+0

이 코드는 작동합니다 (대부분 설명을 얻습니다). 고맙습니다. 나는 충분한 담당자가없는 것이 아닌가 걱정된다. 귀하의 답변을 upvote하지만 난 그것이 허용 대답으로 표시했습니다. – user4301448

+1

아 맞아, 네 -'생산물'은'--aff-coroutines'의 일부입니다. 이것은 당신이 어떤 종류의 효과있는 생산자와 일할 때를위한 것입니다. '-coroutines'는 일반적인 경우 만 처리하고 기본 모나드에 대해서는 의견이 없습니다. 당신이 언급했던 문서에서 주목한다면,'m'은'Monad' 제약을 제외하고''생산자 ''는 순수하기 때문에 완전히 지정되지 않은 채로 남아 있습니다.''Eff'가 도입 된 소비자 일뿐입니다. 거기에'log'를 사용합니다. 이 경우 '생산자'를 평등하게 만들기 위해서는 효과가 있어야하므로 '생산'과 같은 것이 필요합니다. –