我应该如何填充任意集?

时间:2016-08-04 01:39:44

标签: haskell set quickcheck

用于测试Data.Set

The current Arbitrary instance对我来说太复杂了。我真的不懂,所以我真的不相信它。我提出了将 shape 生成与 value 生成分开的想法。

使用

class Monad m => MonadGen m where
  liftGen :: Gen a -> m a
instance MonadGen Gen where
  liftGen = id
instance MonadGen m => MonadGen (StateT s m) where
  liftGen = lift . liftGen

我可以写

mkArb :: MonadGen m => m a -> Int -> m (Set a)
mkArb step n
  | n <= 0 = pure Tip
  | n == 1 = singleton <$> step
  | n == 2 = do
     dir <- liftGen arbitrary
     p <- step
     q <- step
     if dir
       then pure (Bin 2 q (singleton p) Tip)
       else pure (Bin 2 p Tip (singleton q))
  | otherwise = do
      let upper = (3*(n - 1)) `quot` 4
      let lower = (n + 2) `quot` 4
      ln <- liftGen $ choose (lower, upper)
      let rn = n - ln - 1
      (\lt x rt -> Bin n x lt rt) <$> mkArb step ln <*> step <*> mkArb step rn

然后我可以使用类似StateT s Gen的东西来填充严格增加元素的集合。

我有两个问题:

  1. 我是否成功生成了所有平衡树形状?我该怎么检查?

  2. 什么是填写价值观的好方法?我想要密集区域和稀疏区域的集合。当我生成两个集合时,我希望它们重叠一些但不是其他集合,并且它们的范围重叠一些而不是其他的。我不太了解如何实现这些目标。

0 个答案:

没有答案