泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process

  • 时间:
  • 浏览:0

以上组件详细都是过滤输出O的。

  实际上Process[I,O]是有一种固定单一输入类型(single input process):单一是指Process[I,O]只接收I类型输入、固定是指它对外界沟通法律最好的土办法是固定的:没人Halt,Emit,Await有一种情况表。你是什么 情况表原应了Process[I,O]无法成为有效的IO程序运行组件以及朋友须要尝试开发更概括更通用的IO Process。朋友来看个新的IO类型形态学 :Process[F[_],O]

Tee类型假如有一天两个 两头输入的IO Process类型,左边只可不须要输入I,右边只可不须要输入I2。

有了你是什么 |>后朋友可不须要把哪此Process1组件对接到Process[F,O]上:

  type Sink[F[_],O] = Process[F, O => F[Unit]] 

你是什么 应该没人理解:Sink为输出O提供了一系列函数。哪此函数接收输入参数O因此运行F,F假如有一天个运算不返回结果,如IO运算。

Source和Sink类型的实际应用介绍将在下期“IO过程实际应用-IO Process in action”中具体讨论。

注意:组件实现中的写法和时候 Process[I,O]的一样,只不过这次朋友的返回类型是Process1[I,O]。

可能性朋友把F[A]去掉 IO[A]:

  在上两篇讨论中朋友介绍了IO Process:Process[I,O],它的工作原理、函数组合等。很容易想象,两个 详细的IO程序运行是由 数据源+正确处理过程+数据终点: Source->Process->Sink所组成的。朋友发现:Process[I,O]有一种是无法兼顾Source和Sink的功能。而独立附加的Source和Sink又无法有效地与Process[I,O]进行函数组合(functional composition)。

你是什么 新的类型代表能产生一连串的O类型元素。朋友可不须要把它当作List[O]来编写组件。重要的是朋友现在可不须要通过运算F[A]来与外界联系,如:读取文件或数据库内容。运算F[A]返回的数据经过rf函数的正确处理后转入新的情况表:正常完成数据输入时运行fb进入新情况表、可能性输入数据过程中产生异常则运行fl清理战场,释放资源。朋友因此改善了Halt,使之返回终止情况表信息。从前一来Process从整体上更透明,更安全。更重要的是Process可不须要拓展了(extensible)。

朋友同样须要重新定义哪此构建Tee的基本组件:

朋友还可不须要通过Process[F,O]实现两头输入:就像字母T,输入从中间左右两头进入。

朋友下面再看看数据终点Sink与Process[F,O]的关系。朋友希望通过Process[F,O]类型实现输出功能,也假如有一天把Source的输入发送给Sink。朋友用以下法律最好的土办法代表Sink:

朋友只须要考虑下游p等待图片输入await一并上游this正在发送emit这两个 情况表实现对接。其它情况表则等它们一点人调整对口后再对接。

两个 详细的IO程序运行须要包括对数据源Source和数据终点Sink的操作,没人Process[F,O]可不可不须要代表数据源(Source)类型呢?朋友来看看Process[F,O]的读取Await: 

朋友在运算Process时用Try来捕捉异常信息并返回到可控情况表Halt(err),可能性朋友可不须要从返回情况表了解终止情况表 - End:正常终止,Kill:强行终止及Throwable:位于异常终止。

注意以上假如有一天示范了Process[IO,O]作为Process[F,O]的两个 特殊实例是可不须要实现从Source读取数据的。朋友将在下个章节讨论具体的可行方案。

首先,朋友还是要重新塑造一下F[A],使它只容许左边I类,右边I2类输入:

现在朋友再设计一点方便调用的帮助函数(helper functions):

作为两个 安全可用的IO类型,朋友先设计一点Process[F,O]的基本组件:

现在朋友来到了IO Process对接最重要的组件导管(pipe |>)组件了: