Почему Scala не может определить тип метода без скобок и точек - PullRequest
0 голосов
/ 03 мая 2018

Я написал простой код, который возвращает неизменную карту символов и их индексов в виде вектора:

def indexes(string: String): Map[Char, Vector[Int]] = (0 until string.length).
  foldLeft(Map[Char, Vector[Int]]()){
    (m, i) => m + (string(i) -> m.getOrElse(string(i), Vector()).:+(i))
  }

Например:

println(indexes("Mississippi"))
// Map(M -> Vector(0), i -> Vector(1, 4, 7, 10), s -> Vector(2, 3, 5, 6), p -> Vector(8, 9))

Почему Scala не может сделать вывод, что m.getOrElse(string(i), Vector()) :+ i - это Vector[Int] и скомпилировать его? Я должен написать m.getOrElse(string(i), Vector()).:+(i) вместо.

1 Ответ

0 голосов
/ 03 мая 2018

Будет нормально работать со значением Map в скобках:

def indexes(string: String): Map[Char, Vector[Int]] = (0 until string.length).
  foldLeft(Map[Char, Vector[Int]]()){
    (m, i) => m + (string(i) -> (m.getOrElse(string(i), Vector()) :+ i))
  }

indexes("Mississippi")
// res1: Map[Char,Vector[Int]] = Map(M -> Vector(0), i -> Vector(1, 4, 7, 10), s -> Vector(2, 3, 5, 6), p -> Vector(8, 9))

Без заключения в скобки значения Map, часть значения ключа (k -> a :+ b) в приведенном ниже коде будет обрабатываться как (k -> a) :+ b, что приведет к ошибке компиляции:

    (m, i) => m + (string(i) -> m.getOrElse(string(i), Vector()) :+ i)

// <console>:28: error: value :+ is not a member of (Char, Vector[Int])
...