首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏函数式编程语言及工具

    Scalaz(46)- scalaz-stream 基础介绍

        scalaz-stream是一个泛函数据流配件库(functional stream combinator library),特别适用于函数式编程。 从类型款式上看Process是个对O类型值进行F运算的节点,那么scalaz-stream就应该是个运算流了。 Vector[Cause => Trampoline[Process[F, O]]] @uncheckedVariance ) extends Process[F, O] { ... } scalaz-stream scalaz-stream通常把Task作为F运算,下面是Task运算流的构建或者转换方法: 1 val p: Process[Task,Int] = Process.emitAll(Seq(1,2,3 ,然后是scalaz-stream的具体应用

    74370发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(53)- scalaz-stream: 程序运算器-application scenario

        从上面多篇的讨论中我们了解到scalaz-stream代表一串连续无穷的数据或者程序。对这个数据流的处理过程就是一个状态机器(state machine)的状态转变过程。 scalaz-stream的数据处理是有序流程,这样可以使我们更容易分析理解程序的运算过程,它的三个大环节包括:数据源(source),数据传换(transducer)及数据终点(Sink/Channel 我们先来看看scalaz-stream里的一个典型函数: /** * Await the given `F` request and use its result. scalaz-stream就是存粹的泛函类型,那么基于scalaz-stream的程序就自然具备组合的能力了。 scalaz-stream作为一种程序运算框架可以轻松实现FP程序的组合,那么它成为一种安全稳定的泛函多线程编程工具就会是很好的选择。

    67690发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(49)- scalaz-stream: 深入了解-SinkChannel

       一个完整的scalaz-stream有以下几个部分组成:Source -> Transducer -> Sink,用直白文字来描述就是:“输入 -> 传换 -> 输出”。 scalaz-stream最基本的功能就是从Source接收一串元素,经过处理然后输出。毕竟我们从外部获取了数据、处理完毕后总不能就留在原地内存,还是要把数据输出到对当前运算中程序来说的一个外部系统。 //| 4 7 //| 5 实际上scalaz-stream //| 5 15 //| 5 scalaz-stream

    69580发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(47)- scalaz-stream: 深入了解-Source

       scalaz-stream库的主要设计目标是实现函数式的I/O编程(functional I/O)。这样用户就能使用功能单一的基础I/O函数组合成为功能完整的I/O程序。 还有一个目标就是保证资源的安全使用(resource safety):使用scalaz-stream编写的I/O程序能确保资源的安全使用,特别是在完成一项I/O任务后自动释放所有占用的资源包括file 我们在上一篇的讨论里笼统地解释了一下scalaz-stream核心类型Process的基本情况,不过大部分时间都用在了介绍Process1这个通道类型。 在这篇讨论里我们会从实际应用的角度来介绍整个scalaz-stream链条的设计原理及应用目的。 scalaz-stream的其他类型节点将在下面的讨论中深入介绍。

    89250发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(51)- scalaz-stream: 资源使用安全-Resource Safety

        scalaz-stream是一个数据流处理工具库,对资源使用,包括:开启文件、连接网络、连接数据库等这些公共资源使用方面都必须确定使用过程的安全:要保证在作业终止时能进行事后处理程序(finalizer scalaz-stream并且保证了无论在数据产生的上游Source或者消费数据的下游Process都能在作业终止时运行上游Source的finalizer。 scalaz-stream是按照下面的两种情况要求来设计它的finalizer启动程序的: 1、在数据产生源头环节可能开始占用资源,那么在这个环节的终止状态中必须保证运行事后处理程序 2、在消费数据的下游环节终止时必须能够运行由上游 那么scalaz-stream是怎么做到从下游运行上游定义的finalizer呢? scalaz-stream在io对象里提供了一个linesR函数。

    73970发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(52)- scalaz-stream: 并行运算-parallel processing concurrently by merging

       如果scalaz-stream真的是一个实用的数据流编程工具库的话,那它应该能处理同时从多个数据源获取数据以及把数据同时送到多个终点(Sink),最重要的是它应该可以实现高度灵活的多线程运算。 这样也说得过去:它让我们更容易理解scalaz-stream Process的运算过程。面对scalaz-stream这样的特性我们应该怎样去实现它的并行运算呢? scalaz-stream是通过merge来实现并行运算的。merge可以同时读取多个数据源然后产生一个合并的数据流。 scalaz-stream提供了merge.mergeN方法来支持对一顺数据流进行并行运算。 如果我们把上面这个例子用在实际的数据库操作上:比如对几个数据库表里的所有在一定价格范围内商品购买次数进行统计等,我们是可以在scalaz-stream里实现这个场景并行运算的。

    67680发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(50)- scalaz-stream: 安全的无穷运算-running infinite stream freely

    scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现。 相信许多人对scalaz-stream如何实现无穷数据的运算安全都充满了好奇和疑问,那我们就在本篇讨论中分析一下scalaz-stream的具体运算方式。     scalaz-stream是由Process类型组件链接而成。Process是个状态机器(state machine)由Emit、Await、Append、Halt几个状态组成。 我们来详细了解一下具体的scalaz-stream程序实现方式:在之前的讨论里介绍了通过Free Monad编程的特点是算式/算法关注分离。

    1.1K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(54)- scalaz-stream: 函数式多线程编程模式-Free Streaming Programming Model

    scalaz-stream的流程控制和多线程运算模式可以实现程序的安全并行运算。 把Free Monad和scalaz-stream有机结合起来可以形成一种新的编程模式来支持函数式多线程编程来编制具备安全性、易扩展、易维护的并行运算程序。 把这个Free Monad程序转换成scalaz-stream的Process也很容易: 1 val prcGetName = Process.eval(taskGetName) //> prcGetName 下面我们用scalaz-stream的运算方式来运算这个Free Monad程序: 1 object FreeInteract extends App { 2 import DSLs.

    72160发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(48)- scalaz-stream: 深入了解-Transducer: Process1-tee-wye

       在上一篇讨论里我们介绍了Source,它的类型款式是这样的:Process[F[_],O]。Source是通过await函数来产生数据流。await函数款式如下: def await[F[_],

    1.3K50发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(56)- scalaz-stream: fs2-安全运算,fs2 resource safety

        fs2在处理异常及资源使用安全方面也有比较大的改善。fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常、在纯代码里隐式引发异常或者在运算中引发异常,举例如下:

    83650发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(57)- scalaz-stream: fs2-多线程编程,fs2 concurrency

        fs2的多线程编程模式不但提供了无阻碍I/O(java nio)能力,更为并行运算提供了良好的编程工具。在进入并行运算讨论前我们先示范一下fs2 pipe2对象里的一些Stream合并功能。我

    1.1K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation

        fs2是scalaz-stream的最新版本,沿用了scalaz-stream被动式(pull model)数据流原理但采用了全新的实现方法。 fs2比较scalaz-stream而言具备了:更精简的基础组件(combinator)、更安全的类型、资源使用(type safe, resource safety)、更高的运算效率。 由于fs2基本沿用了scalaz-stream的原理,所以我们会在下面的讨论里着重介绍fs2的使用。 我们知道,纯数据流就是scalaz-stream里的Process1,即transducer,是负责对流进行状态转换的。

    1.8K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(58)- scalaz-stream: fs2-并行运算示范,fs2 parallel processing

    98180发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Scalaz(59)- scalaz-stream: fs2-程序并行运算,fs2 running effects in parallel

        scalaz-stream-fs2是一种函数式的数据流编程工具。fs2的类型款式是:Stream[F[_],O],F[_]代表一种运算模式,O代表Stream数据元素的类型。实际上F就是一种延

    81260发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介

    我们在前面介绍过scalaz-stream,它与akka-stream的主要区别在于: 1、scalaz-stream是pull模式的,而akka-stream是push模式的。 scalaz-stream的运算器是自备的函数式程序,特点是能很好的控制线程使用和进行并行运算。akka-stream的运算器是materializer。

    2K60发布于 2018-01-05
  • 来自专栏函数式编程语言及工具

    Akka(19): Stream:组合数据流,组合共用-Graph modular composition

    无法想象如果用纯函数数据流如scalaz-stream应该怎样去实现这么复杂的流程,也可能根本是没有解决方案的。 nestedFlow.to(Sink.head) } // Putting all together val closed = source.via(flow.filter(_ > 1)).to(sink) 和scalaz-stream

    1.3K100发布于 2018-01-05
领券