泛函编程(22)-泛函数据类型-Monoid In Action

  • 时间:
  • 浏览:0
  • 来源:彩神快三手机版

只要 ,只要 但是 用并行算法说说你这些:

没错!

大伙 在但是的章节里这样 讨论了你这些数据特性如List,Stream,Tree等。当大伙 时要防止你这些特性中封装的元素时通常使用你这些算法如折叠算法。你这些算法能保存数据特性。只要 它们有共通性:都可不时要使用折叠算法。既然有共性,肯定就会有深度抽象的空间,大伙 可不时要把它们抽象表达成有有一三个白 Foldable[F[_]]:List,Stream,Tree等数据特性类型你这些F[_];有有一三个白 数据特性中封装了你这些元素。你这些Foldable类型可不时要涵盖各种历遍算法:

右折叠:op(a,op(b,op(c,d)))

左折叠:op(op(op(a,b),c),d)

这不你这些搜索引擎中的索引比重算法吗?大伙 用foldMapV和mapMergeMonoid可不时要并行运算分派索引,这是否是Monoid的实际应用之一。

大伙 看看具体实现:

最后,大伙 试着用mapMergeMonoid实例来实现frequencyMap:计算输入List里的文字发现次数。只要 用有有一三个白 例子来说明说说,看看下面你这些一串文字转成key-value Map:

只要 大伙 可不时要使用并行算法说说,肯定能提升计算速度单位。试想只要 大伙 对有有一三个白 超大文件进行文字数统计只要 寻找最大值你这些的,大伙 可不时要把你这些大文件分成若干小文件只要 同去计算后再合计将节省你这些计算时间。在现代大数据时代,数据文件不但大只要 是分布在你这些服务器上的。这样Monoid的特殊定律就可不时要使数据防止并行运算,不如可匹配大数据防止模式。

下面剩下的时间大伙 再讨论你这些较冗杂的Monoid:

Vector("a rose", "is a", "rose is", "a rose") >>> Map(a -> 3, rose -> 3, is -> 2)

大伙 看看可不时要实现像折叠算法似的并行算法:

可不时要看出TreeFoldable的实现法律办法与List,Stream等串类数据类型有所不同。这是只要 Tree类型这样现成的折叠算法。再你这些Tree类型这样空值(不到Leaf, Branch)。你这些特性暗示着你这些类型的Monoid是这样恒等值的。大伙 统称你这些类型为semigroup。

 在上一节大伙 讨论了Monoid的结合性和恒等值的作用以及Monoid如可与串类元素折叠算法相匹配。不过大伙 只示范了一下基础类型(primitive type)Monoid实例的应用,你这些上一节的讨论目的是理论多于实践。在你这些节大伙 将把重点贴到 你这些实用综合类型(composite type)Monoid实例及Monoid的抽象表达及函数组合能力。

在历遍过程中大伙 把List每个节点元素值转成一对值 a => (1, a),只要 分别对每个成员实施intAdditionMonoid的op操作。

啊,你这些foldMapV从外表,在类型款式上跟foldMap相同,不同的是内部人员具体实现法律办法;foldMapV循环把目标串进行分半。

    Monoid的二元操作函数具有结合特性(associativity),与恒等值(identity)同去应用可不时要任意采用左折叠或右折叠算法防止串类元素(List element)而得到同等结果。你这些使用Monoid op大伙 可不时要得出左折叠等于右折叠的结论:

再来有有一三个白 例子:检查一串数字是否是有序的:

结合前面对并行运算的讨论,大伙 用以下法律办法应该可不时要实现并行运算吧:

只要 有有一三个白 函数的结果是Monoid,大伙 可不时要实现你这些函数的Monoid实例:

再来有有一三个白 合并key-value Map的Monoid实例:只要 大伙 有value类型的Monoid实例就可不时要实现:

并行算法:op(op(a,b),op(c,d)) 大伙 可不时要同去运算 op(a,b), op(c,d)

值得注意的是以上有有一三个白 例子foldMapV历遍无论如只是不必中途退出的。你这些特点把foldMapV的使用局限在时要消耗整个数据源的计算应用,如求和、最大值等等。对于另外你这些要求,如:A => Boolean你这些要求,即使第有有一三个白 值就只要 得到答案也时要走删改串数据。

在你这些例子里大伙 用Option[min,max,ordered]作为当前请况并用stateMonoid来防止你这些请况。foldMapV参数(i => Some(i,i,true))你这些标准的 A => B。还记得吗,大伙 增加foldMap你这些函数是的目的是只要 元素A这样Monoid实例,这样大伙 可不时要用Monoid[B]只要 用A =>B函数把A转成B但是 使用Monoid[B]。这里大伙 把 i转成Some(Int,Int,Boolean)。

 Option的foldable与TreeFoldable很像:

实现你这些Monoid实例的应当尽量从类型匹配入手:函数A => B的结果是B;大伙 有Monoid[B],Monoid[B].op(b,b)=>b。