Hedgehog.Gen.list
定义如下:
-- | Generates a list using a 'Range' to determine the length.
--
list :: MonadGen m => Range Int -> m a -> m [a]
list range gen =
sized $ \size ->
(traverse snd =<<) .
ensure (atLeast $ Range.lowerBound size range) .
shrink Shrink.list $ do
k <- integral_ range
replicateM k (freeze gen)
我原以为 usingShrink.list
足以产生列表的所有缩小。但是它会调用freeze
:
-- | Freeze the size and seed used by a generator, so we can inspect the value
-- which it will produce.
--
-- This is used for implementing `list` and `subtermMVec`. It allows us to
-- shrink the list itself before trying to shrink the values inside the list.
--
freeze :: MonadGen m => m a -> m (a, m a)
freeze =
freezeGen
从函数的评论中,我理解了为什么使用它,但我对如何实现这个目标以及将其排除在外会产生什么效果感到困惑。