2013-04-24 4 views
5

Я написал реализацию для foldl и хотел проверить, сработало ли это, я пробовал некоторые случаи и, похоже, работает хорошо, но я хочу убедиться.Использование quickCheck

Я читал о QuickCheck и пробовал, но я не могу заставить его работать, это код

foldl'' :: (b -> a -> b) -> b -> [a] -> b 

test :: Eq b => (b -> a -> b) -> b -> [a] -> Bool 
test f e ls = foldl'' f e ls == foldl f e ls 

когда я бегу quickCheck test он выдает следующее сообщение об ошибке:

No instance for (Show (b0 -> a0 -> b0)) 
    arising from a use of `quickCheck' 
Possible fix: 
    add an instance declaration for (Show (b0 -> a0 -> b0)) 
In the expression: quickCheck prueba 
In an equation for `it': it = quickCheck prueba 

ответ

7

Ваша собственность требует трех входов: функции, элемента и списка. Проблема в том, что QuickCheck не знает, как справляться с функциями в целом.

Одна из вещей, которые QuickCheck должна работать, - это возможность записывать неудачные тестовые примеры на консоль. Для этого ему нужны значения, которые он может превратить в String - все в классе Show. Поскольку функции не находятся в Show, они не могут использовать их для ввода. Вот откуда приходит ваше сообщение об ошибке.

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

2

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

Это говорит о том, что тестирование вашего имущества, скорее всего, имеет больше смысла с функциями, которые вы сами выбираете, чтобы вы могли написать что-то вроде quickCheck $ prueba (+), которое будет работать нормально.

6

Существует способ избежать ограничения Show на входы с использованием модификатора Blind, который позволит вам использовать механизмы QuickCheck для генерации случайных функций.

-- Using Int instead of a, b which would be defaulted to() in GHCi 
prueba :: Blind (Int -> Int -> Int) -> Int -> [Int] -> Bool 
prueba (Blind f) e ls = foldl'' f e ls == foldl f e ls 

Тем не менее, это означает, что выход провала почти бесполезен для отладки, так как это будет просто распечатать (*) для слепого ввода. (Для демонстрации я определил foldl'' = foldr . flip)

> quickCheck prueba 
*** Failed! Falsifiable (after 4 tests and 2 shrinks):  
(*) 
0 
[1,0] 
+0

Не в области видимости: конструктор типа или класса 'Blind» – chamini2

+0

@ chamini2: Вы импортировали 'Test.QuickCheck'? – hammar

+0

да, может быть, потому, что я на OS X? 'Ghci --version: система славного Glasgow Haskell, версия 7.4.2' – chamini2

Смежные вопросы