【发布时间】:2019-12-14 06:56:00
【问题描述】:
这个问题是关于 Haskell Pipes 库的
背景:
在previous question 中,我询问如何使用管道形成循环,the answer I got 是“不要那样做。改用request 和response。”虽然有一个出色且清晰的tutorial,其中涵盖了Producers、Consumers、Pipes 和Effects,用简单的英语写成。用于request 和response Client 和Server 的documentation 首先定义Categories 并提及其他一些CompSci 概念,例如“the generator design pattern.”和“the iteratee design pattern”。从来没有解释过。所以我不知道如何“改用request 和response”。
设置
我有两个类似状态机的东西需要反复来回传递数据,robot 和 intCode。
机器人很简单:
robot :: Pipe Int Int m r -- robot never returns so its return type is polymorphic
robot = go newRobot
where
go r = do
yield $ color r
c <- toColor <$> await
turn <- toTurn <$> await
go $ update c turn r
它yields 一个值,awaits 两个指令(一个新颜色和一个转弯),更新机器人的状态 (r),然后重新开始。
intCode 虚拟机运行编程以与机器人通信。它需要一个程序(称为code)并创建一个管道,该管道将await 传感器从机器人读取,然后yield 向它发送两条指令。
(boot code) :: Pipe Int Int m ()
假设 IntCode VM 不容易修改,但机器人是。
问题:
request 和 respond 与 await 和 yield 有何不同?
如何使用它们来促进机器人和 VM 之间的持续通信?
【问题讨论】:
-
有趣的是,package blurb 说“优于传统流媒体库:<...> 双向性:实现双工通道”但它没有说“...实现双工通道”;并且“双工”不在index 中(这就是我所知道的)。
标签: haskell haskell-pipes