Почему преобразование for-выражения вDouble приводит к неожиданной последовательности? - PullRequest
0 голосов
/ 02 августа 2020

Я играл с выражениями и обнаружил, что имею дело с неожиданным результатом. Лучше всего проиллюстрировать примером:

  val someList = List(2.2, 3.4)

  val strangeDoubles = for {
    s <- someList.toString.replace(".", "")
  } yield s.toDouble

  println(strangeDoubles)

  // result: ArraySeq(76.0, 105.0, 115.0, 116.0, 40.0, 50.0, 50.0, 44.0, 32.0, 51.0, 52.0, 41.0)

Насколько я понимаю, выражение for с одним l oop превращается в forEach. Однако я не совсем уверен, как закончился массив со следующими числами. Я ожидал, что результат будет примерно таким: List (22.0, 34.0)

Ответы [ 2 ]

4 голосов
/ 02 августа 2020

для понимания расширяется до

someList.toString.replace(".", "").map((s: Char) => s.toDouble)

заменяя someList.toString, мы получаем

"List(2.2, 3.4)".replace(".", "").map((s: Char) => s.toDouble)

упрощая "List(2.2, 3.4)".replace(".", "") получаем

"List(22, 34)".map((s: Char) => s.toDouble)

теперь отображение применяет (s: Char) => s.toDouble к каждому символу String, поэтому концептуально у нас есть что-то вроде

Vector(
  'L'.toDouble,
  'i'.toDouble,
  's'.toDouble,
  't'.toDouble,
  '('.toDouble,
  '2'.toDouble,
  '2'.toDouble,
  ','.toDouble,
  ' '.toDouble,
  '3'.toDouble,
  '4'.toDouble,
  ')'.toDouble
)

, которое в конечном итоге оценивается как

Vector(76.0, 105.0, 115.0, 116.0, 40.0, 50.0, 50.0, 44.0, 32.0, 51.0, 52.0, 41.0)
4 голосов
/ 02 августа 2020

Вы превратили List в большую String , затем вы выполнили map (не foreach) для каждого Char из String , а затем вы преобразовали каждый Char в Double , что выполняется путем преобразования каждого символа в его код ASCII .

Я действительно не понимаю, почему вы превратили весь список в String , может быть, вы хотели сделать это для каждого элемента? Примерно так:

val strangeDoubles = for {
  d <- someList
  s = d.toString.replace(".", "")
} yield s.toDouble

Или в этом случае я бы просто позвонил map напрямую.

someList.map { d =>
  d.toString.replace(".", "").toDouble
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...