gpt4 book ai didi

scala - Scala 中点和空格的区别

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

当用于从 Scala 中的对象调用函数时,. 之间到底有什么区别?

由于某种原因,我得到了一些变化,例如:

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

scala> l foldLeft(0)((hd, nxt) => hd + nxt)
<console>:13: error: Int(1) does not take parameters
| foldLeft(1)((hd, nxt) => hd + nxt)
^
scala>l.foldLeft(0)((hd, nxt) => hd + nxt)
res2: Int = 2

(当我这样做时,该操作的名称是什么?我一直试图找到 . 运算符的严格定义,但我不知道它叫什么。)

最佳答案

如果对象上的被调用函数中没有参数,则使用空格而不是点称为后缀表示法,或者如果函数有参数则称为中缀表示法需要。

Postix示例:l sum,相当于l.sum

中缀示例:l map (_ * 2),相当于l.map(_ * 2)

这些符号的问题在于它们的解释本质上更加模糊。数学中的一个经典例子:

  • 1 + 2 * 3 + 4 是不明确的,取决于运算符的优先级。
  • 1.+(2.*(3).+(4) 只有一种有意义的解释。

因此,它不是一个不同的运算符,而是与点相同,只是容易产生歧义,从而在链接中缀运算符时导致语法错误(如您的情况)甚至更严重的逻辑错误。

实际上,您可以通过以下方式用中缀表示法表达foldLeft:

(l foldLeft 0)((hd, nxt) => hd + nxt) 

甚至

(0 /: l)((hd, nxt) => hd + nxt)

其中/:只是foldLeft的别名,并利用以冒号(:)结尾的运算符的独特语义,它被解释为l./:(0) (与通常相反)。

关于scala - Scala 中点和空格的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173203/

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