Scala: обратный результат при экранировании подчеркивания с ::: - PullRequest
6 голосов
/ 24 февраля 2012

Пытаясь ответить на этот вопрос: Оставьте подчеркивание в буквальном значении функции Я попытался написать пример и столкнулся со странным поведением.

scala> val myList = 1::2::Nil
myList: List[Int] = List(1, 2)

scala> def concat:(List[Int]=> List[Int]) = myList:::
concat: (List[Int]) => List[Int]

scala> concat(3::Nil)
res1: List[Int] = List(3, 1, 2)

Хотя у меня хороший ответ, когда я использую синтаксисы _ или x=> f(x).

scala> def concat0:(List[Int]=> List[Int]) = x=> myList:::x
concat0: (List[Int]) => List[Int]

scala> def concat1:(List[Int]=> List[Int]) = myList::: _
concat1: (List[Int]) => List[Int]

scala> concat0(3::Nil)
res2: List[Int] = List(1, 2, 3)

scala> concat1(3::Nil)
res3: List[Int] = List(1, 2, 3)

Есть ли рациональное объяснение, почему myList следует после 3::Nil в функции concat?

1 Ответ

7 голосов
/ 24 февраля 2012

myList ::: _ переводится в _.:::(myList), тогда как myList ::: переводится в myList.:::(_).

tl; dr

Это сообщение подробнее о правильных ассоциативных методах.Здесь происходит следующее:

  • def concat0:(List[Int]=> List[Int]) = x=> myList:::x
    • Компилятор Scala может сделать вывод, что x, если типа List[Int]
    • List имеет метод :::
    • Из-за правил правильной ассоциативности это превращается в x.:::(myList), что добавляет myList к x.
  • def concat: (List [Int] => List [Int]) = myList :::
    • myList, если типа List[Int]
    • Нет правой стороны :::, поэтому нет правойассоциативность
    • Вместо этого компилятор выводит a.между myList и :::
    • myList.::: совпадает с x => myList.:::(x), что означает x до myList.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...