51. def blend(ma: Map[String, Set[Int]],
mb: Map[String, Set[Int]])
: Map[String, Set[Int]] = {
val result = mutable.Map() ++ ma
mb foreach { case (k, v) =>
???
}
result.toMap
}
52. def blend(ma: Map[String, Set[Int]],
mb: Map[String, Set[Int]])
: Map[String, Set[Int]] = {
val result = mutable.Map() ++ ma
mb foreach { case (k, v) =>
if (result.contains(k))
result += k -> (result(k) ++ v)
else
result += k -> v
}
result.toMap
}
54. def blend(ma: Map[String, Set[Int]],
mb: Map[String, Set[Int]])
: Map[String, Set[Int]] = {
}
(ma /: mb) { case (result,(k, v)) =>
if (result.contains(k))
result + (k -> (result(k) ++ v))
else
result + (k -> v)
}
val result = mutable.Map() ++ ma
mb foreach { case (k, v) =>
if (result.contains(k))
result += k -> (result(k) ++ v)
else
result += k -> v
}
result.toMap
55. def blend(ma: Map[String, Set[Int]],
mb: Map[String, Set[Int]])
: Map[String, Set[Int]] = {
(ma /: mb) { case (result,(k, v)) =>
if (result.contains(k))
result + (k -> (result(k) ++ v))
else
result + (k -> v)
}
}
56. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
}
57. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
// .map(_ ++ v).getOrElse(v)
}}
58. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
// .map(_ ++ v).getOrElse(v)
// .some(_ ++ v).none(v)
}}
59. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
// .map(_ ++ v).getOrElse(v)
// .some(_ ++ v).none(v)
// .fold(v)(_ ++ v)
}}
60. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
// .map(_ ++ v).getOrElse(v)
// .some(_ ++ v).none(v)
// .fold(v)(_ ++ v)
// .cata(_ ++ v, v)
}}
“FP with Bananas, Lenses, Envelopes and Barbed Wire” – http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.125
http://en.wikipedia.org/wiki/Catamorphism
61. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
// .map(_ ++ v).getOrElse(v)
// .some(_ ++ v).none(v)
// .fold(v)(_ ++ v)
// .cata(_ ++ v, v)
}}
http://stackoverflow.com/questions/5328007/why-doesnt-option-have-a-fold-method
62. (ma /: mb) { case (result,(k, v)) =>
result + (k -> {
result.get(k) match {
case Some(vr) => vr ++ v
case None => v
}
// .map(_ ++ v).getOrElse(v)
// .some(_ ++ v).none(v)
// .fold(v)(_ ++ v)
// .cata(_ ++ v, v)
}}
http://stackoverflow.com/questions/5328007/why-doesnt-option-have-a-fold-method
63. (ma /: mb) { case (result, (k, v)) =>
result + (k -> result.get(k).cata(_ ++ v, v))
}
mb foreach { case (k, v) =>
result += (k -> result.get(k).cata(_ ++ v, v))
}
64. (ma /: mb) { case (result, (k, v)) =>
result + (k -> result.get(k).cata(_ ++ v, v))
}
mb foreach { case (k, v) =>
result += (k -> result.get(k).cata(_ ++ v, v))
}
91. /**
* A semigroup in type F must satisfy two laws:
*
* - '''closure''': `∀ a, b in F, append(a, b)` is also in `F`.
* - '''associativity''': `∀ a, b, c` in `F`, the equation
* `append(append(a, b), c) = append(a, append(b , c))` holds.
*/
trait SemigroupLaw {
def associative(f1: F, f2: F, f3: F)(implicit F: Equal[F]): Boolean =
F.equal(append(f1, append(f2, f3)), append(append(f1, f2), f3))
}
95. Map("a" -> 1, "b" -> 4) |+| Map("a" -> 2)
res: Map[…] = Map(a -> 3, b -> 4)
“Some data structures form interesting semigroups as long as
the types of the elements they contain also form semigroups.”
101. “Experience indicates that nearly everybody
has the wrong idea about the real bottlenecks
in his programs” – Donald Knuth
Computer programming as an art (1974) – http://dl.acm.org/citation.cfm?id=361612