मेरे पास दो गुण हैं जो एक फ़ंक्शन 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 = []

जब मैंने Prop_2 के साथ QuickCheck चलाने का प्रयास किया तो मुझे निम्न त्रुटि मिलती है:

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)

मुझे यकीन नहीं है कि मुझे यह त्रुटि क्यों मिल रही है और मैं इसे कैसे हल कर सकता हूं। किसी भी अंतर्दृष्टि की सराहना की जाती है।

1
ceno980 28 जून 2019, 13:12

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि QuickCheck पर दस्तावेज़ कहता है:

हालांकि, इससे पहले कि हम ऐसी संपत्ति का परीक्षण कर सकें, हमें यह देखना होगा कि फ़ंक्शन मान मुद्रित किए जा सकते हैं (यदि कोई प्रति-उदाहरण पाया जाता है)। अर्थात्, फ़ंक्शन प्रकार Show वर्ग के उदाहरण होने चाहिए। इसे व्यवस्थित करने के लिए, आपको इस प्रकार के उच्च-क्रम वाले गुणों वाले प्रत्येक मॉड्यूल में मॉड्यूल ShowFunctions आयात करना होगा। यदि कोई प्रति-उदाहरण मिलता है, तो फ़ंक्शन मान "<function>" के रूप में प्रदर्शित होंगे

तो आप एक मॉड्यूल आयात करके इसे ठीक कर सकते हैं जैसे:

import Text.Show.Functions

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)
1
Willem Van Onsem 28 जून 2019, 13:20

आप जनरेशन के लिए 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> से अधिक उपयोगी कुछ देखेंगे।

2
Alexey Romanov 28 जून 2019, 13:47