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
的东西来填充严格增加元素的集合。
我有两个问题:
我是否成功生成了所有平衡树形状?我该怎么检查?
什么是填写价值观的好方法?我想要密集区域和稀疏区域的集合。当我生成两个集合时,我希望它们重叠一些但不是其他集合,并且它们的范围重叠一些而不是其他的。我不太了解如何实现这些目标。