Вы можете представить карту как особый тип частичной функции - частичное означает, что не обязательно определены все значения.
То есть карта m = Map[S,T]
также является функцией типа S=>T
.
Давайте рассмотрим пример
scala> val includes = Map( 1 -> true, 2->false, 3-> false, 4->true)
includes: scala.collection.immutable.Map[Int,Boolean] = Map(1 -> true, 2 -> false, 3 -> false, 4 -> true)
scala> (1 to 4).filter(includes)
res6: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 4)
(Если значение в последовательности отсутствует, вы получите ошибку времени выполнения).
Итак, в вашем вопросе вы передаете Map charCode
в функцию map, вы спрашиваете, почему она компилируется?
Ну, String
в Scala - это псевдоним типа для Java string
. Но в Predef
имеется неявное преобразование из String
в StringWrapper
(низкий приоритет) - преобразует строку в последовательность Char
и StringOps
(более высокий приоритет), которая внедряет методы сбора (например, map
). Вы можете прочитать больше в документации для строк .
Таким образом, компилятор Scala обрабатывает вашу String как последовательность Char
s, а функция map преобразует каждого члена, используя предоставленную «функцию», то есть карту charCode
.