2015-09-22 13 views
7

के खिलाफ QuickCheck चल रहा है:निम्नलिखित को देखते हुए साधारण परीक्षण w/समारोह

test :: (Int -> Int) -> Int -> Bool 
test _ _ = True 

स्रोत संकलन के बाद, मैं quickCheck test चलाने का प्रयास:

> quickCheck test 
<interactive>:27:1: 
    No instance for (Show (Int -> Int)) 
     arising from a use of ‘quickCheck’ 
    In the expression: quickCheck test 
    In an equation for ‘it’: it = quickCheck test 

इस Show instance for functions को देखते हुए, पर मुझे ऐसा लगता है कि ऐसा कोई उदाहरण मौजूद नहीं है।

मैं quickCheck test कैसे चला सकता हूं, यानी Int -> Int के लिए अनुपलब्ध Show उदाहरण को प्राप्त करें या पता करें?

उत्तर

8

क्विक चेक में एक विशेष मॉड्यूल Test.QuickCheck.Function है जो "फ़ंक्शंस" उत्पन्न करने के लिए दिखाया जा सकता है (और "सिकुड़" भी होता है, जिससे क्विकचैक अपने काउंटररेक्समल्स को सरल बनाता है)। आप उन्हें apply का उपयोग करके सामान्य कार्यों में परिवर्तित कर सकते हैं।

import Test.QuickCheck 
import Test.QuickCheck.Function 

test :: Fun Int Int -> Int -> Bool 
test _ _ = True 

test2 :: Fun Int Int -> Int -> Bool 
test2 f x = apply f x == x 
फिर GHCi में

:

*Main> quickCheck test 
+++ OK, passed 100 tests. 
*Main> quickCheck test2 
*** Failed! Falsifiable (after 2 tests and 3 shrinks): 
{_->0} 
1 

यह कार्यों के लिए खुद को एक Show उदाहरण परिभाषित है, और उस का उपयोग करने के वास्तव में संभव है उदाहरण के लिए आप फ़ाइल है। लेकिन जब तक आपका इनपुट प्रकार Bool जैसे सीमित प्रकार का नहीं है, तो आप इस तरह के फ़ंक्शन के बारे में सभी जानकारी प्रिंट नहीं कर पाएंगे। आप नहींText.Show.Functions से उपयोगी जानकारी दिखाते हुए एक डमी इंस्टेंस आयात कर सकते हैं।

हालांकि, ऊपर दिए गए Test.QuickCheck.Function.Fun प्रकार का उपयोग ऐसा लगता है कि इसे आवश्यक जानकारी को अधिक संक्षेप में देने के लिए डिज़ाइन किया गया है, इसलिए यदि संभव हो तो मैं निश्चित रूप से स्वयं का उपयोग करूँगा।

संबंधित मुद्दे