Scala:反转结果,同时使用:::转义下划线

Chr*_*che 6 collections 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)
Run Code Online (Sandbox Code Playgroud)

虽然我在使用_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)
Run Code Online (Sandbox Code Playgroud)

有没有为什么合理的解释myList后,来到3::Nil在功能concat

lee*_*777 7

myList ::: _转换为_.:::(myList),而myList :::转换为myList.:::(_).

TL;博士

这篇文章详细介绍了正确的关联方法.这里发生的事情是:

  • def concat0:(List[Int]=> List[Int]) = x=> myList:::x
    • Scala编译器可以推断出x的类型 List[Int]
    • List有一个:::方法
    • 由于正确的相关性规则,这种情况变成了x.:::(myList)前所未有myListx.
  • def concat :( List [Int] => List [Int])= myList :::
    • myList 如果是类型 List[Int]
    • 没有右手边:::,所以没有权利相关性
    • 相反,编译器推断出一个.之间myList:::
    • myList.:::是相同的x => myList.:::(x),其预先考虑xmyList.