QuickCheck - Не исчерпывающие паттерны в функции - Haskell - PullRequest
0 голосов
/ 06 ноября 2018

У меня две функции. Один реализован с использованием шаблонов, а другой с использованием интенсивных списков. Я хочу проверить, всегда ли результат одинаков с QickCheck.

pares xs = [a | a <- xs , mod a 2 == 0]
cuadrados xs = [x^2 | x <- pares xs ]
cuadrados'' [] = []
cuadrados'' (x:xs) = [x^2] ++ cuadrados'' xs
cuadrados' (x:xs)  = cuadrados'' (pares (x:xs))

Я пытаюсь:

prop_cuadrados xs = cuadrados xs == cuadrados' xs

Когда я пытаюсь выполнить команду quickCkeck prop_cuadrados, получается следующее:

* Main> quickCheck prop_cuadrados *** Не удалось! (после 1 теста): Исключение: sesion4.hs: 10: 1-47: Неисчерпывающие закономерности в функции cuadrados ' []

Как я могу решить эту проблему? Спасибо

1 Ответ

0 голосов
/ 07 ноября 2018

Мы можем немедленно найти эту проблему, если применим -Wall в GHC (который автоматически включает -Wincomplete-patterns) или просто попробуем пример найденного счетчика вручную.

QuickCheck находит xs = [] в качестве контрпримера. Итак, давайте посмотрим на cuadrados':

cuadrados' []

В этот момент мы не можем продолжать, поскольку cuadrados' связывается только с одним шаблоном: (x:xs). К сожалению, [] не может соответствовать этому шаблону, и в результате вы получите ошибку. Чтобы это исправить, просто добавьте другой шаблон:

cuadrados' []     = []
cuadrados' (x:xs) = …

или просто используйте

cuadrados' xs = cuadrados'' (pares xs)

, поскольку мы не используем первый элемент явно.

При этом pares - это filter even, а cuadrados - это map (^2) . filter even. Попробуйте использовать стандартную библиотеку и функции более высокого порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...