【问题标题】:Simple QuickCheck Test Never Completes简单的 QuickCheck 测试永远不会完成
【发布时间】: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值,然后调用randomRFractional实例,但我可能无意中创建了一个无限递归函数...

标签: haskell quickcheck


【解决方案1】:

您的Random 实例中的Micro 似乎有问题

这里有一个快速解决方法:

{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}

import Data.Fixed
import System.Random
import Test.QuickCheck

toDouble :: Micro -> Double
toDouble = realToFrac . toRational

instance Random Micro where
    randomR (lo, hi) g =
      let (a,g') = randomR (toDouble lo, toDouble hi) g
      in (fromRational (toRational a), g')
    random = randomR (-999999, 999999)

data FooType = FooType { foo :: Micro } deriving (Show)

instance Arbitrary FooType where
    arbitrary =
        FooType <$> x
        where
            x = choose (0.0, 1.0)

main :: IO ()
main = quickCheck prop_foo_is_gte_zero
  where prop_foo_is_gte_zero ft = foo ft >= 0.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多