Это for
-понимание разбито на
nmem.flatMap { case (digit, str) => str.map { ltr => (ltr, digit) } }
Поскольку nmem
имеет тип Map[Char, String]
, компилятор знает, что (digit, str)
должен иметь тип (Char, String)
. Таким образом, он знает, что str
имеет тип String
. Элементы String
имеют тип Char
, таким образом, тип ltr
выводится как Char
.
Если бы вы хотели записать все кровавые детали вывода типа, вы бы получили что-то вроде этого:
nmem.flatMap[(Char, Char), Map[Char, Char]]{
case (digit: Char, str: String) =>
str.map[(Char, Char), Seq[(Char, Char)]]{
(ltr: Char) => (ltr, digit)
}
}
К счастью, в этом нет необходимости, поскольку все эти типы могут быть выведены автоматически.