Почему сокращение прекращается, когда одно из условий полностью сокращено - PullRequest
4 голосов
/ 24 сентября 2019

Я смотрю на комментарии в shrink:

Заманчиво написать последнюю строку как [Branch x' l' r' | x' <- shrink x, l' <- shrink l, r' <- shrink r], но это не то!Это заставит QuickCheck сжать x, l и r в тандеме, и сжатие прекратится, как только один из трех полностью уменьшится.

Я немного озадачен этимЯ думал, что проблема с этим сокращением заключается в том, что мы берем декартово произведение сокращений подтермов, которое может быть довольно большим.Я не понимаю, почему сжатие остановится, как только один из трех элементов будет полностью сжат.

Другими словами, я думал, что приведенное выше определение вычислит все комбинации сокращений x, l иr, но я бы не ожидал, что сжатие прекратится, как только условия полностью сузятся.

1 Ответ

3 голосов
/ 24 сентября 2019

Предложенный код неверен , потому что мы рассматриваем только те сокращения, которые сокращают все три условия хотя бы на один шаг.Чтобы увидеть проблему, представьте, что все три кандидата Int:

x = 1
l = 0
r = 2

Тогда у нас есть

shrink x = [0]
shrink l = []
shrink r = [1, 0]

Вложенное понимание списка этих трех списков не даст никаких значений, потому что нетподходящего кандидата на l можно найти.Поэтому мы никогда не пробуем некоторые допустимые сокращения, такие как (0, 0, 1).Экземпляр shrink для кортежей делает правильные вещи (предлагая каждое сокращение, где может быть сокращен хотя бы один термин), поэтому отображение на это решает проблему.

...