【发布时间】:2018-10-26 20:02:11
【问题描述】:
我可以让 ZMQ 订阅者在 Haskell 中工作,但希望获得有关如何将这些数据与 Pipes 一起使用的指导。我编写生产者的尝试在“堆栈构建”时失败,并出现以下错误:
无法将类型“代理 X () c'0 c0 (ZMQ z)”与“ZMQ z”匹配
预期类型:ZMQ z ()
实际类型:Proxy X () c'0 c0 (ZMQ z) ()
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad
import Pipes
import qualified Pipes.Prelude as P
import System.ZMQ4.Monadic
import qualified Data.ByteString.Char8 as CS
fromZMQ :: (Receiver r) => Socket z r -> Producer String (ZMQ z) ()
fromZMQ sock = do
msg <- lift $ receive sock
yield (CS.unpack msg)
fromZMQ sock
main :: IO ()
main = --do
runZMQ $ do
subSock <- socket Sub ---subscriptionSocket
subscribe subSock ""
connect subSock "tcp://127.0.0.1:4998"
forever $ fromZMQ subSock >-> P.take 3 >-> P.print
注意,我想使用 Python 脚本在 ZMQ 上发布的数据。
【问题讨论】:
-
我建议不要使用 monadic zmq API 并在需要时滚动你自己的 Monad。或者考虑通过 Chan 和工作线程间接到 zmq,该线程只是将数据传输到 zmq 或从 zmq 传输数据。
-
感谢@Thomas 提出调查陈的建议。因为我认为 zeroMQ 提供了 Chan 提供的缓冲,所以我能够使用 MVar 运行一些东西,这似乎巧妙地解决了我正在努力解决的潜在问题,即。如何在不出现 > 运行时错误的情况下更新状态表示。下面的代码,以防它帮助别人。
标签: haskell zeromq haskell-pipes