设为首页 加入收藏

TOP

Scalaz(8)- typeclass:Monoid and Foldable(四)
2017-10-10 12:13:43 】 浏览:11552
Tags:Scalaz typeclass Monoid and Foldable
V]] = 2 new Monoid[Map[K, V]] { 3 def zero = Map[K,V]() 4 def append(a: Map[K, V], b: => Map[K, V]) = 5 (a.keySet ++ b.keySet).foldLeft(zero) { (acc,k) => 6 acc.updated(k, V.append(a.getOrElse(k, V.zero), 7 b.getOrElse(k, V.zero))) 8 } 9 } //> mapMergeMonoid: [K, V](V: scalaz.Monoid[V])scalaz.Monoid[Map[K,V]] 10 11 val M: Monoid[Map[String, Map[String, Int]]] = mapMergeMonoid(mapMergeMonoid(Monoid[Int])) 12 //> M : scalaz.Monoid[Map[String,Map[String,Int]]] = Exercises.monoid$$anonfun 13 //| $main$1$$anon$4@79e2c065 14 val m1 = Map("o1" -> Map("i1" -> 1, "i2" -> 2)) //> m1 : scala.collection.immutable.Map[String,scala.collection.immutable.Map[ 15 //| String,Int]] = Map(o1 -> Map(i1 -> 1, i2 -> 2)) 16 val m2 = Map("o1" -> Map("i2" -> 3)) //> m2 : scala.collection.immutable.Map[String,scala.collection.immutable.Map[ 17 //| String,Int]] = Map(o1 -> Map(i2 -> 3)) 18 val m3 = M.append(m1, m2) //> m3 : Map[String,Map[String,Int]] = Map(o1 -> Map(i1 -> 1, i2 -> 5))

我们可以用这个组合成的M的append操作进行map的深度合并。m1,m2合并后:Map(o1->Map("i1"->1,"i2" -> 5))。

我们还可以用这个Monoid来统计一段字串内字符发生的频率:

1 def frequencyMap[A](as: List[A]): Map[A, Int] =
2     as.foldMap((a: A) => Map(a -> 1))(mapMergeMonoid[A, Int](Monoid[Int])) 3                                                   //> frequencyMap: [A](as: List[A])Map[A,Int]
4 frequencyMap("the brown quik fox is running quikly".toList) 5   //> res24: Map[Char,Int] = Map(e -> 1, s -> 1, x -> 1, n -> 4, y -> 1, t -> 1, 6   //| u -> 3, f -> 1, i -> 4, -> 6, q -> 2, b -> 1, g -> 1, l -> 1, h -> 1, r - 7   //| > 2, w -> 1, k -> 2, o -> 2)

我们现在可以体会到Monoid必须在可折叠数据结构(Foldable)内才能正真发挥作用。

 

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇8.Spark集群测试 下一篇Scalaz(9)- typeclass:checki..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目