首页 > 解决方案 > 对于表达式过滤器不过滤任何东西

问题描述

这是一个出乎意料地根本不起作用的理解(或表达式):过滤器没有效果

只是试图减少两个随机整数的范围

请帮忙

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。相反,该元素只是从迭代中丢弃。

标签: scalascalacheck

解决方案


您的代码试图过滤5 个值。顶部是( ) ,底部是、2147483646和( )。那么为什么( ) 会不断出现呢?2147483647Int.MaxValue-2147483646-2147483647-2147483648Int.MinValue-2147483648Int.MinValue

这是因为没有Int价值+2147483648。由于abs(-2147483648)不能表示为正值,它实际上返回负值,即相同的Int.MinValue值,小于2147483645所以它没有过滤掉。


推荐阅读