Прервать вычисление выражения Haskell, если достигнут предел памяти - PullRequest
12 голосов
/ 24 апреля 2019

Я использую QuickCheck для проверки автоматически сгенерированных свойств (аналогично QuickSpec ), но одна распространенная проблема, с которой я сталкиваюсь, - это исчерпание памяти из-за наивных рекурсивных генераторов или очень больших выходов функций(например, один сбой был вызван показательной функцией для чисел Пеано, которая генерировала огромные вложенные структуры).

Мне интересно, есть ли способ отказаться от оценки, если (резидентный) предел памяти достигнут.Кажется, мы можем сделать это для тайм-аутов , но память кажется более сложной.Таким образом, если мы используем слишком много памяти, этот тест можно отбросить (как если бы предварительное условие ==> не выполнено).

Я могу увидеть, как измерить использование памяти всей программой, посмотрев на источникweigh пакета.Это было бы работоспособно, но было бы гораздо приятнее (и надежнее) измерить его для одного конкретного выражения (возможно, получая память, используемую одним потоком, или что-то в этом роде?).

Для моих целей это было быдостаточно, чтобы полностью нормализовать выражение, поскольку мне не нужно беспокоиться о рекурсивных структурах (я могу применить это к результатам теста, которые фактически являются логическими значениями).

...