我是Scala编程语言的新手,当我在遵循讲义上的讲义时,我正在尝试陷入困境的东西 这里.

我认为我真的不明白CONS运营商的工作原理,这是我尝试过的一些事情:

我已经创建了一个伪随机编号生成器,然后尝试创建一个随机值的列表:

scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332

scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
 found   : List[Int]
 required: Int
       gen nextInt 3 :: Nil
                     ^

但是它试图将列表(3)传递给NextNT方法。当我使用PARATHES时,没有问题

scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)

我对执行顺序感到好奇,所以我创建了一个函数来检查它

scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int

scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)

如输出所示,执行顺序与外观顺序相同。然后我认为这可能是关于“ nextint”功能的,然后我尝试了以下内容:

scala> 1 + 2 :: Nil
res72: List[Int] = List(3)

它首先执行加法,然后执行该缺点。所以这是一个问题: gen nextInt 3 :: Nil1 + 2 :: Nil?

有帮助吗?

解决方案

这里有两件事: 优先固定性. 。正如Sepp2k提到的那样,堆栈溢出上的这个问题解释了所引用的优先级,规则不够完整,并且从Scala 2.7到Scala 2.8的更改很小。差异主要涉及运营商结束 =, , 尽管。

至于 固定性, ,Scala中的几乎所有内容都从左到右读取,这就是程序员所使用的。但是,在Scala中,运营商结束 : 向右读取。

然后以这个示例为例:

1 + 2 :: Nil

首先,优先。最优先的是 + 或者 :?根据桌子, + 优先考虑 :, ,因此添加是首先完成的。因此,表达与以下方式相等:

((1).+(2)) :: Nil

现在没有优先冲突,但是 :: 结束 :, ,它具有不同的固定性。因此,它是右至左阅读的,因此:

Nil.::((1).+(2))

另一方面,在此:

gen nextInt 3 :: Nil

运营商 :: 优先考虑 nextInt, , 因为 : 优先于所有字母。因此,记住它的固定性,它变成了:

gen nextInt Nil.::(3)

然后变成

gen.nextInt(Nil.::(3))

在这一点上,错误是显而易见的。

PS:我在写 (1).+(2) 代替 1.+(2) 因为,在写作时, 1. 被解释为双重数字,制作 1.+(2) 添加双1.0至2的infix表达式截至Scala 2.10.0,该语法被弃用,并且可能不会在Scala 2.11上存在。

其他提示

这是关于优先级而不是执行命令。 + 比优先级高 ::, , 所以 a + b :: c 解析 (a + b) :: c. 。但是,带有常规名称的infix方法呼叫的优先级较低,因此 a foo b c 解析 a foo (b c).

这个问题 对于按照Scala的优先级订购的运营商列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top