Я пытался написать тест QuickCheck для идентификации
f $ y = f y
Мой первоначальный план состоял в том, чтобы написать произвольный генератор, который возвращает функции & Integer, с подписью Gen (Int -> Int, Int)
и в тесте prop_DollerDoesNothing
это приложение функции с / без $
дает тот же результат.
Это был мой код:
prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(f, y) -> (f $ y) == (f y))
arbitraryFuncInt :: Gen (Int -> Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f, y)
И было сгенерировано следующее полезное сообщение об ошибке.:
* No instance for (Show (Int -> Int))
arising from a use of `forAll'
(maybe you haven't applied a function to enough arguments?)
* In the expression:
forAll arbitraryFuncInt (\ (f, y) -> (f $ y) == (f y))
In an equation for `prop_DollarDoesNothing':
prop_DollarDoesNothing
= forAll arbitraryFuncInt (\ (f, y) -> (f $ y) == (f y))
Итак, я исправил ошибку и получил тест на работу, применив произвольную функцию и вернув пару целых чисел из arbitraryFuncInt
prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(x, y) -> x == y)
arbitraryFuncInt :: Gen (Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f $ y, f y)
Мои вопросы:
- просто невозможно вернуть произвольные функции, которые не были полностью применены из-за отсутствия экземпляра для
Show
? - Могу ли я написать экземпляр для
Show (Int -> Int)
всделать возможным # 1
? - Может ли QuickCheck генерировать произвольные функции с учетом сигнатуры типа, для случаев, когда я проверяю идентичности, которые являются истинными для всех функций (данного типа).Выше я указываю 3 тестовые функции вручную, я хотел бы как-то автоматизировать это, в идеале что-то вроде этого
f <- arbitrary :: Gen (Int -> Int)