KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I was working through Odersky's ScalaDays 2011 keynote talk , where he constructs a phone number synonym generator in remarkably few lines of code, when I got to this particular line (assigning charCode ): val mnem: Map[Char, String] = // phone digits to mnemonic chars (e.g. '2' -> "ABC") val charCode: Map[Char, Char] = for ((digit, str) <- mnem; letter <- str) yield (letter -> digit) // gives ('A', '2'), ('B', '2') etc Why is charCode of type Map ? When I yield tuples in other examples, I merely obtain a sequence of tuples -- not a map. For example: scala> for (i <- 1 to 3) yield (i -> (i+1)) res16: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,2), (2,3), (3,4)) One can easily convert that to a map with toMap() , like so... scala> (for (i <- 1 to 3) yield (i -> (i+1))).toMap res17: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 2 -> 3, 3 -> 4) ... but somehow, Odersky's example avoids this. What Scala magic, if any, am I overlooking here? Addendum 1: Implicit conversion? I'd like to add some detail pertaining to Oxbow Lake's comment (NB: my comment there may be partially in error, having misunderstood slightly, perhaps, what he was getting at). I suspected that some kind of implicit conversion was happening because a map was required. So I tried Odersky's iterator in the interpreter, with no hints as to what it should produce: scala> val mnem = Map('2' -> "ABC", '3' -> "DEF", '4' -> "GHI") // leaving as a map, still scala> for ((digit, str) <- mnem; letter <- str) yield (letter, digit) res18: scala
Tags (comma-separated)
Save Edits
Cancel