【发布时间】:2015-05-18 23:49:35
【问题描述】:
我在思考 QuickCheck 时遇到了一些麻烦。考虑以下简单数据类型及其对应的任意实例。
编辑:下面的完整代码在评论中要求。 fixedToFractional 将固定数值类型如Micro 转换为Fractional。
import Data.Fixed
import System.Random
import Control.Applicative
import Test.QuickCheck
fixedToFractional :: (HasResolution a, Fractional b) => Data.Fixed.Fixed a -> b
fixedToFractional = fromRational . toRational
instance Random Micro where
randomR (lo, hi) g = randomR (fixedToFractional lo, fixedToFractional hi) g
random g = randomR (-999999, 999999) g
data FooType = FooType { foo :: Micro } deriving (Show)
instance Arbitrary FooType where
arbitrary =
FooType <$> x
where
x = choose (0.0, 1.0)
如果我理解正确,这应该允许生成随机的 FooType 值,并将 foo 字段设置为 0 到 1 之间的随机值。
接下来,考虑下面的简单测试。
prop_foo_is_gte_zero ft = (foo ft) >= 0.0
当我尝试运行上述测试时,无论是在 ghci 中,还是在使用 quickCheckAll 的测试文件中,测试都不会完成。 ghc 在几秒钟内就吃掉了几吉格的 RAM,如果我不杀掉它,我的机器最终会耗尽交换空间。我可能错过了一些非常基本/愚蠢的东西,但(显然)不知道是什么。有什么想法吗?
编辑:我现在质疑我的 Random 实例。也许问题就在那里,而不是我的Arbitrary 实例。
【问题讨论】:
-
能否给出完整的代码(包括
imports)?因为只有您的代码不会使用明显的导入进行编译 -choose将希望Micro成为Random的实例 -
@CarstenKönig 我已编辑问题以包含完整代码。对于那个很抱歉。在这个过程中,你让我质疑我的
Random实例...我的想法是将输入转换为Fractional值,然后调用randomR的Fractional实例,但我可能无意中创建了一个无限递归函数...
标签: haskell quickcheck