gpt4 book ai didi

Scala:使用::转义下划线时的相反结果

转载 作者:行者123 更新时间:2023-12-04 14:49:25 25 4
gpt4 key购买 nike

试图回答这个问题时:Leave off underscore in function literal我尝试编写一个示例,但遇到了一个奇怪的行为。

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 ?

最佳答案

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

tl;博士

This post更详细地介绍了右关联方法。这里发生的事情是:

  • def concat0:(List[Int]=> List[Int]) = x=> myList:::x
  • Scala 编译器可以推断 x if 类型为 List[Int]
  • List有一个 :::方法
  • 由于右结合规则,这变成 x.:::(myList) , 前面加上 myListx .
  • def concat:(List[Int]=> List[Int]) = myList:::
  • myList如果类型为 List[Int]
  • 没有:::的右手边,所以没有右结合
  • 相反,编译器推断一个 .之间myList:::
  • myList.:::x => myList.:::(x) 相同, 前面加上 xmyList .
  • 关于Scala:使用::转义下划线时的相反结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9436119/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com