for expressions 过滤器不过滤任何东西
for expressions filter doesn't filter anything
这是一个 for comprehension(或 for expressions)意外地根本不起作用:过滤器没有效果
只是想减少两个随机整数的范围
请帮忙
import java.lang.Math.abs
import org.scalacheck._
import Arbitrary._
object Main extends App {
lazy val minus2Int : Gen[Int] = for {
int1 <- arbitrary[Int]
if (abs(int1) < 2147483645)
} yield int1
println(minus2Int.sample)
println(minus2Int.sample)
println(minus2Int.sample)
}
书中提到:
如果匹配成功,模式中的变量将绑定到元素的相应部分,就像第 15 章中描述的那样。但是如果匹配失败,则不会抛出 MatchError。相反,该元素只是从迭代中丢弃。
您的代码正在尝试过滤 out 5 个值。在顶部,2147483646
和 2147483647
(Int.MaxValue
),在底部,-2147483646
、-2147483647
和 -2147483648
(Int.MinValue
).那么为什么 -2147483648
(Int.MinValue
) 一直出现?
因为没有Int
值+2147483648
。由于 abs(-2147483648)
不能表示为正值,它实际上 returns 是负值,即相同的 Int.MinValue
值, 小于 2147483645
所以它 没有 过滤掉。
这是一个 for comprehension(或 for expressions)意外地根本不起作用:过滤器没有效果
只是想减少两个随机整数的范围
请帮忙
import java.lang.Math.abs
import org.scalacheck._
import Arbitrary._
object Main extends App {
lazy val minus2Int : Gen[Int] = for {
int1 <- arbitrary[Int]
if (abs(int1) < 2147483645)
} yield int1
println(minus2Int.sample)
println(minus2Int.sample)
println(minus2Int.sample)
}
书中提到:
如果匹配成功,模式中的变量将绑定到元素的相应部分,就像第 15 章中描述的那样。但是如果匹配失败,则不会抛出 MatchError。相反,该元素只是从迭代中丢弃。
您的代码正在尝试过滤 out 5 个值。在顶部,2147483646
和 2147483647
(Int.MaxValue
),在底部,-2147483646
、-2147483647
和 -2147483648
(Int.MinValue
).那么为什么 -2147483648
(Int.MinValue
) 一直出现?
因为没有Int
值+2147483648
。由于 abs(-2147483648)
不能表示为正值,它实际上 returns 是负值,即相同的 Int.MinValue
值, 小于 2147483645
所以它 没有 过滤掉。