Scala: обратный результат при экранировании подчеркивания с:::

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

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 ответ

Решение

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

ТЛ; др

Этот пост более подробно рассказывает о правильных ассоциативных методах. Что здесь происходит:

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