泛函编程(38)-泛函Stream IO:IO Process in action

  • 时间:
  • 浏览:1
  • 来源:5分排列3_5分排列3官网

大伙前要实现逐行输出,却说 用许多stepWrite来运算IO。stepWrite是通过返回Emit来实现无穷循环的。

底下的例子readFile却说用许多await函数来打开文件: IO {new BufferedReader(new FileReader(fileName))}

这段代码是详细也有很清晰的描述了其所代表的功能,不错!

大伙首先应该把IO运算最好的土办法 重新定义一下。用await函数显得太简化:

读取一行:IO {r.readLine},意味 读取成功则发送emit出去: case Right(line) => emit(line,next), 

以下提供更多的应用示范:

大伙用PartialFunction来描述运算iorequest后返回正常结果意味 异常所对应的避免最好的土办法 。

从一一两个多多多 文件里读取存放亨氏温度的文件名后进行温度转换并存装进celsius.txt中

首真难注意的是这句:unsafePerformIO(rq)(E)。它会真正产生副作用。当Process[IO,O] src当前情形是Await的却说就会进行IO运算。运算IO产生的结果作为Await的rf函数输入参数,正如大伙底下描述的一样。却说 ,运算IO{iorequest}却说构建一一两个多多多 Await形状把iorequest和转换情形函数rf装进就像曾经:

很明显readFile确实太有针对性了。函数类型款式变的简化可读性低。大伙前要一种更概括的形式来实现泛函编程语言的简练而流畅表达形式。

意味 老出异常则关闭文件:case Left(err) => IO {r.close},注意大伙会使用异常End来代表正常完成读取:

{ case Left(err) => Process[IO,???]; case Right(a) => Process[IO,???] } 

打开文件fahrenheit.txt 

把亨氏温度转去掉 摄氏温度数

 大伙先试试一一两个多多多 读取文件字符内容的组件:

join组件却说标准的monadic组件,意味 大伙前要把 Process[F,Process[F,Unit]]打平为Process[F,Unit]:

下一步是把Sink和Process对接起来。大伙前要用以下的to组件来连接:

许多返回到collect,collect看到src情形是Await就会运算iorequest许多再运行rf。

Channel和Sink非常类式,差别只在Process[F,O]和Process[F,Unit]。

 在前面的几节讨论里大伙终于得出了一一两个多多多 概括又通用的IO Process类型Process[F[_],O]。许多类型一块儿前要代表数据源(Source)和数据终端(Sink)。在这节讨论里大伙将针对Process[F,O]的形状通过许多应用实例来示范它的组合性(composibility)和由数据源到接收终端IO全过程的功能详细性。

这底下的温度转换函数如下:

await(iorequest)(rf)(fb,fl) = Await(ioreques,rf,fb,fl),

  大伙意味 在前面的讨论中对IO Process的各种函数组合进行了调研和尝试,现在大伙先探讨一下数据源设计方案:为了实现资源使用的安全性和IOtcp连接的可组合性,大伙前要保证无论在完成资源使用或老出异常时数据源都能得到释放,一块儿所有副作用的产生都前要延后直至Interpreter结束了了运算IOtcp连接时。

没人 大伙就会得到读取一行字符;过滤起始为#的行;转成大写字符;返回再读一行交替循环曾经的效果了。

过滤空行意味 以#结束了了的字行,可通过的字行代表亨氏温度数

现在大伙应该前要很简练但又不失清楚详尽地描述一段IOtcp连接:

现在到了了解IO过程的另一端:Sink的却说了。大伙意味 前要通过Process来实现输出功能说说,也却说把Source[O]的许多O发送输出到一一两个多多多 Sink。实际上大伙也前要用Process来表达Sink,先看一一两个多多多 简单版本的Sink如下:

没人 运算IO只前要曾经写:eval(iorequest),是详细也有精简多了。

读取一行字符

大伙的下一一两个多多多 问题是咋样把文件里的内容一行一行读入而详细也有一次性预先详细搬进内存,曾经大伙前要读一行,避免一行,占用共要内存。大伙再仔细看看readFile的许多主次:

req是个F[A],在例子里却说IO[A]。把许多函数精简表述却说: await(IO(iorequest))(ioresult => Process)。从许多函数的款式前要看出:在调用await函数的却说不用说会产生副作用,意味 产生副作用的说说是包嵌在IO{}底下的。大伙前要一一两个多多多 interpreter来运算许多IO{...}产生副作用。await的曾经输入参数是 iorequest => Process:iorequest是运算iorequest返回的结果:前却说A即String意味 是个异常Exception。却说 大伙前要用PartialFunction来表达:

再来一一两个多多多 通用安全的IO资源使用组件函数:

大伙用Channel来描述一一两个多多多 数据库查询: