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

  • 时间:
  • 浏览:38

一点 应该真难理解:Sink为输出O提供了一系列函数。哪此函数接收输入参数O但会 运行F,F也不个运算不返回结果,如IO运算。

大家 只时需考虑下游p守候输入await一同上游this正在发送emit一点 另俩个请况实现对接。其它请况则等它们买车人调整对口后再对接。

作为一另俩个安全可用的IO类型,大家 先设计一点Process[F,O]的基本组件:

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

  在上两篇讨论中大家 介绍了IO Process:Process[I,O],它的工作原理、函数组合等。很容易想象,一另俩个全版的IO应用程序是由 数据源+防止过程+数据终点: Source->Process->Sink所组成的。大家 发现:Process[I,O]并也有是无法兼顾Source和Sink的功能。而独立附加的Source和Sink又无法有效地与Process[I,O]进行函数组合(functional composition)。

一另俩个全版的IO应用程序时需包括对数据源Source和数据终点Sink的操作,没法Process[F,O]可不还时需代表数据源(Source)类型呢?大家 来看看Process[F,O]的读取Await: 

以上组件也有 过滤输出O的。

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

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

大家 同样时需重新定义哪此构建Tee的基本组件:

大家 在运算Process时用Try来捕捉异常信息并返回到可控请况Halt(err),意味 大家 还时需从返回请况了解终止请况 - End:正常终止,Kill:强行终止及Throwable:位于异常终止。

  实际上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。

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

注意以上也不示范了Process[IO,O]作为Process[F,O]的一另俩个特殊实例是还时需实现从Source读取数据的。大家 将在下个章节讨论具体的可行方案。

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

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

大家 还还时需通过Process[F,O]实现两头输入:就像字母T,输入从里面左右两头进入。

有了一点 |>后大家 还时需把哪此Process1组件对接到Process[F,O]上:

大家 下面再看看数据终点Sink与Process[F,O]的关系。大家 希望通过Process[F,O]类型实现输出功能,也也不把Source的输入发送给Sink。大家 用以下法子 代表Sink:

意味 大家 把F[A]上加IO[A]:

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