用flatmap和function理解Scala代码

用flatmap和function理解Scala代码,scala,Scala,我正在为考试做准备,看我课程的旧考试。对于其中一个问题,我们必须显示给定代码的结果 val primes4 = List(2, 3, 5, 7) def foo(num:Int) = num > 1 && ((2 to num-1 toList) forall (x => num % x != 0)) val result = primes4.flatMap(x => x :: (x to x+1 toList).filter(x => !foo(x)))

我正在为考试做准备,看我课程的旧考试。对于其中一个问题,我们必须显示给定代码的结果

val primes4 = List(2, 3, 5, 7)
def foo(num:Int) = num > 1 && ((2 to num-1 toList) forall (x => num % x != 0))
val result = primes4.flatMap(x => x :: (x to x+1 toList).filter(x => !foo(x)))
问题的答案是,结果应该是这样的

结果:列表(2,3,4,5,6,7,8)

我以为我理解了代码,直到我看到列表中包含了7。我不知道为什么7包含在下面的方式中

我们有7个

7:7,8

7> 1是真的

对于所有(2,3,4,5,6)个数%x!=这是真的

so TRUE&&TRUE求值为TRUE so x=>!foo(x)的计算结果应为false。我想如果这是错误的,那么为什么包括7?有人能告诉我我做错了什么吗?或者答案完全错了吗


如果你能一步一步地列出发生了什么,这将是最佳的解决方案。

x::(x到x+1 toList)。filter(x=>!foo(x))
–这会将
x
前置到
的结果中。filter
,因此,当
x=7
时,无论
foo
在做什么,它都会被包括在内。@Dima如果你想把它作为一个答案发布,我可以选择它
foo
只检查一个数字是否是素数
result
只取四个素数,对于每个素数
x
,如果是非素数,则插入
x+1
。也就是说,除了2之外,它在每个素数之后插入下一个数字。因此,答案必须是
2,3,4,5,6,7,8
,因为4,6,8分别跟在3,5,7后面。这个代码毫无意义;它看起来像是纯粹为了用不可理解的荒谬代码折磨贫困学生而发明的。