Haskell: тестирование на основе свойств для функции высшего порядка - PullRequest
1 голос
/ 28 июня 2019

У меня есть два свойства, которым должна удовлетворять функция foo:

prop_1 :: [Int] -> Bool
prop_1 xs = foo xs id == xs 

prop_2 :: [Int] -> (Int -> Int) -> (Int -> Int) -> Bool
prop_2 xs f g = foo (foo xs f) g == foo xs (g . f)

Я пытаюсь проверить, удовлетворяют ли вышеуказанные свойства следующей функции, используя quickCheck:

foo :: [a] -> (a -> b) -> [b]
foo xs f = []

Когда я попытался запустить quickCheck с prop_2, я получил следующую ошибку:

quickCheck(prop_2)

<interactive>:18:1: error:
     No instance for (Show (Int -> Int))
        arising from a use of 'quickCheck'
        (maybe you haven't applied a function to enough arguments?)
     In the expression: quickCheck (prop_2)
      In an equation for 'it': it = quickCheck (prop_2)

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

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

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

prop_2 :: [Int] -> Fun Int Int -> Fun Int Int -> Bool
prop_2 xs (Fn f) (Fn g) = foo (foo xs f) g == foo xs (g . f)

, и тогда вы увидите что-то более полезное, чем <function> дляконтрпримеры.

1 голос
/ 28 июня 2019

Как указано в документации на QuickCheck:

Однако, прежде чем мы сможем протестировать такое свойство, мы должны убедиться, что значения функции могут бытьнапечатано (если встречный пример найден).То есть типы функций должны быть экземплярами класса Show.Для этого вам необходимо импортировать модуль ShowFunctions в каждый модуль, содержащий свойства высшего порядка такого типа.Если встречный пример найден, значения функции будут отображаться как "<function>"

Так что вы можете это исправить, импортировав такой модуль как:

<b>import Text.Show.Functions</b>

prop_1 :: [Int] -> Bool
prop_1 xs = foo xs id == xs 

prop_2 :: [Int] -> (Int -> Int) -> (Int -> Int) -> Bool
prop_2 xs f g = foo (foo xs f) g == foo xs (g . f)
...