小编use*_*399的帖子

Pipes.Binary.decode - StateT用于什么?

我正在尝试使用管道和基于它构建的各种库来编写基本的网络服务器.预期的流程是:

从socket接收字节串 - >使用二进制解码 - >服务器逻辑在这里 - >发送响应到套接字

我认为这将是:

fromSocket s 4096 >-> decode >-> serverLogic >-> toSocket s
Run Code Online (Sandbox Code Playgroud)

管道二进制有一个decode和一个decodeMany,但我不确定我理解差异,我不知道如何使用decode.为什么decodeMany将上游管道作为参数而不是用它链接>->?你如何使用decode,StateT我的管道最终应该是什么样的?

haskell haskell-pipes

8
推荐指数
1
解决办法
213
查看次数

如何使用管道状态?

我有一个类型的功能Map Int String -> Proxy () a () Void IO b.现在它await是s,做任何有价值的东西,然后重新调用自己.我想把它更改为使用State (Map Int String)而不是将其作为参数传递,所以我可以使用forever并且不需要让每个分支都记得递归.我得到了我需要用来与另一个monad StateT结合State,但是我不明白那个类型签名StateT属于哪个,或者我是否需要lift像这样的函数get.对于a State (Map Int String)和a 的函数,正确的类型是Proxy () a () Void IO b什么?

haskell haskell-pipes

6
推荐指数
1
解决办法
649
查看次数

这是一个多用户网络服务器的理智架构吗?(管道并发引入了多少开销?)

我目前有它,所以有一个线程处理接受循环,一个主线程用于执行所有有状态逻辑的东西,然后每个连接客户端2个线程.一个客户端线程正在处理输入管道并使用管道并发将消息发送到主逻辑线程.另一个客户端线程正在处理输出管道,从主逻辑线程获取消息并将它们发送到客户端.

我这样做的理由是主逻辑线程可以使用工作线程对不可变状态进行纯计算,然后立即执行所有状态更改并使用新状态循环回来.这样我就可以使用多个CPU,而不必担心并发状态修改的问题.

STM /管道 - 并发的开销是否足够小,这是一种合理的方法,当我最终会有几千个连接的客户端每秒发送两到三条消息时?

haskell haskell-pipes

5
推荐指数
1
解决办法
182
查看次数

根据时间限制管道?

是否可以创建获取在特定时间段内向下游发送的所有值的管道?我正在实现一个服务器,协议允许我连接传出的数据包并将它们压缩在一起,所以我想ByteString每隔100ms 有效地"清空"下游的队列,mappend然后将它们放在一起,然后输出到下一个管道.做压缩.

haskell haskell-pipes

5
推荐指数
1
解决办法
258
查看次数

部分记录的安全替代方案?

我正试图找出一种合理的方法让我的图书馆用户为我提供一系列功能来控制它的行为方式.我想为他们提供一些默认值,他们可以根据自己的需要进行组合和覆盖.显而易见的方式(对我来说)只是一个类似函数的记录,Foo {a, b, c, d, e}并使它成为一个monoid,然后提供一些默认值mappend.但我制作的默认值不会提供所有功能.所以我可能有一个记录,{a, b}一个{c, d}和另一个{b, c, e}.这显然是不安全的,并且用户可以向我提供类似记录的记录{a, b, c, e}.我希望用户能够混合和匹配这样的部分,但仍然必须以完整的记录结束.

有没有一种安全的方法来做这样的事情?如果我将记录中的所有函数都设置为Maybe函数,那么我至少可以这样做,以便我可以检查提供的值是否缺少函数,但是它们仍然在运行时而不是编译时获得该错误.如果可以的话,我宁愿让"必须提供记录中的所有字段"由编译器强制执行.

haskell

5
推荐指数
1
解决办法
542
查看次数

标签 统计

haskell ×5

haskell-pipes ×4