Proponuję, aby połączyć te mapy jako operację monoid-append
.
Najpierw musimy stworzyć mapy map mapach jako pojedynczych elementów:
val input = """Bob, Carrots, United States, 200
|Bill, Potatoes, England, 100
|Bob, Oranges, England, 50
|Bob, Carrots, United States, 20""".stripMargin.lines.toList
val mmm = input.map(_.split(", "))
.map { case Array(n, g, c, v) => Map(n -> Map(g -> Map(c -> v.toInt))) }
mmm
jest typu List[Map[String, Map[String, Map[String, Int]]]]
:
List[Map[String,
Map[String,
Map[String, Int]]]]
Wtedy moglibyśmy suml
użyciu biblioteki jak scalaz
lub cats
:
import scalaz._, Scalaz._
println(mmm.suml)
To będzie drukować (nie idented):
Map(Bill -> Map(Potatoes -> Map(England -> 100)),
Bob -> Map(Oranges -> Map(England -> 50),
Carrots -> Map(United States -> 220)))
Aby pomóc zrozumieć, co dzieje się za działania .suml
bym bezwstydnie sugerują do kasy tej prezentacji zrobiłem w ubiegłym roku https://speakerdeck.com/filippovitale/will-it-blend-scalasyd-february-2015
EDIT
Możemy również zobaczyć nasze mapy map map jako Foldable
i używać foldMap
do tego samego rezultatu:
kody
input.map(_.split(", "))
.foldMap{ case Array(n, g, c, v) => Map(n -> Map(g -> Map(c -> v.toInt))) }
Innymi słowy, Perl jest tu zwycięzcą;) – Ashalynd
... tak, ale czekam na Perl6 przed ponownym użyciem :-P Po tym trollu zaktualizuję odpowiedź bardziej szczegółowym wyjaśnieniem i alternatywną odpowiedzią. –
Świetny sposób na przeczytanie mapy Map of Maps ... – BarneyW