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)
, который prependsmyList
вx
,
- Компилятор Scala может сделать вывод, что x, если имеет тип
- def concat:(List[Int]=> List[Int]) = myList:::
myList
если типаList[Int]
- Там нет правой стороны
:::
так что нет правой ассоциативности - Вместо этого компилятор выводит a. между
myList
а также:::
myList.:::
такой же какx => myList.:::(x)
, который prependsx
вmyList
,