2

以下结果在我看来是一个奇怪的结果。

rascal> [x|int x<-[0..3],x==2||x==2];

list[int]: [2,2]

我预料到了这一点。

rascal> [x|int x<-[0..3],(x==2||x==2)?true:false];
list[int]: [2]
4

1 回答 1

1

是的,这确实有点奇怪但始终如一。

答案是“循环”在每次可以使条件为真时进行迭代,在逗号上回溯,在 && 和 || 上进行回溯。和 !,但(还)没有超过 ?:、函数调用和其他运算符。所以,

x==2 || x==2 

可以通过两种方式实现,这就是为什么你得到 2 个答案,并且使用 ?: 它只尝试一次。

这种迭代行为是必要的,因为我们也想要这个结果:

rascal>[x|int x<-[0..3],x==2||x==3];
list[int]: [2,3]
于 2013-07-23T19:34:16.367 回答