scala - 对于表达式过滤器不过滤任何东西
问题描述
这是一个出乎意料地根本不起作用的理解(或表达式):过滤器没有效果
只是试图减少两个随机整数的范围
请帮忙
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。相反,该元素只是从迭代中丢弃。
解决方案
您的代码试图过滤掉5 个值。顶部是( ) ,底部是、2147483646
和( )。那么为什么( ) 会不断出现呢?2147483647
Int.MaxValue
-2147483646
-2147483647
-2147483648
Int.MinValue
-2147483648
Int.MinValue
这是因为没有Int
价值+2147483648
。由于abs(-2147483648)
不能表示为正值,它实际上返回负值,即相同的Int.MinValue
值,小于2147483645
所以它没有被过滤掉。
推荐阅读
- r - 停止在 R 中重新排序 Y 轴的 Geom-Point
- node.js - Cron 运行 2 次 node-cron
- javascript - 从localStorage加载值后如何设置样式?
- javascript - 淡入 javascript 中的背景以及视频
- reactjs - 如何使用 Typescript 重构 React 中的道具?
- r - 在ggplot中结合geom_rect和facet_grid的麻烦
- boost - mingw 和 BOOST 预处理宏
- c++ - 在头文件中使用指令
- reactjs - Formik 表单不呈现
- yocto - 将 compile_commands.json 文件的路径提供给 coc-clangd