إنشاء قائمة قوائم int مع QuickCheck
-
18-09-2019 - |
سؤال
أنا أعمل من خلال العالم الحقيقي Haskell. واحدة من التدريبات من الفصل 4 هي تنفيذ foldr
نسخة قائمة منconcat
. وبعد اعتقدت أن هذا سيكون مرشحا كبيرا لاختبار مع QuickCheck لأن هناك تطبيق موجود للتحقق من صحة نتائجي. ولكن هذا يتطلب مني تحديد مثيلArbitrary
typeclass التي يمكن أن تولد تعسفي [[Int]]
. وبعد حتى الآن لم أتمكن من معرفة كيفية القيام بذلك. كانت محاولتي الأولى:
module FoldExcercises_Test
where
import Test.QuickCheck
import Test.QuickCheck.Batch
import FoldExcercises
prop_concat xs =
concat xs == fconcat xs
where types = xs ::[[Int]]
options = TestOptions { no_of_tests = 200
, length_of_tests = 1
, debug_tests = True }
allChecks = [
run (prop_concat)
]
main = do
runTests "simple" options allChecks
هذا يؤدي إلى عدم إجراء أي اختبارات. النظر إلى مختلف البتات وقطع خمنت أن Arbitrary
مطلوب إعلان مثيل وأضاف
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
وقد أدى ذلك إلى تشكو GHCI من أن إعلان مثيل الخاص بي غير صالح وأن إضافة -xflexiblinstances قد يحل مشكلتي. مضيفا {-# OPTIONS_GHC -XFlexibleInstances #-}
نتائج التوجيه في عدم تطابق نوع وتحذير مثيلات متداخلة.
لذلك سؤالي هو ما هو مطلوب لجعل هذا العمل؟ من الواضح أنني جديد إلى Haskell وأنا لا أجد أي موارد تساعدني بها. هناك تقدير كبير لأي مؤشرات.
يحرر
يبدو أنني كنت مضلما عن إخراج QuickCheck عند اختبار الطريقة الأولى fconcat
يعرف ب
fconcat = undefined
في الواقع تنفيذ الوظيفة يعطي بشكل صحيح بالفعل النتيجة المتوقعة. ثنائي!
المحلول
[[Int]]
هو بالفعل an. Arbitrary
مثيل (بسبب Int
هو Arbitrary
المثال، لذلك هو [a]
للجميع a
S أنفسهم حالات Arbitrary
). لذلك ليست المشكلة.
ركض رمزك بنفسي (استبدال import FoldExcercises
مع fconcat = concat
) وقد ركضت 200 اختبارات كما كنت أتوقع، لذلك أنا mystified لماذا لا تفعل ذلك من أجلك. لكنك لا تحتاج إلى إضافة Arbitrary
نموذج.