Каков эффект заморозки в определении Hedgehog.Gen.list - PullRequest
0 голосов
/ 07 марта 2019

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)

Я бы ожидал, что использования Shrink.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

Из комментариев функции я понимаю, почему она используется, но я озадачен тем, как эта цель достигнута и чтоЭффект был бы в том, чтобы оставить это вне.

...