سؤال

أنا أعمل من خلال العالم الحقيقي 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] للجميع aS أنفسهم حالات Arbitrary). لذلك ليست المشكلة.

ركض رمزك بنفسي (استبدال import FoldExcercises مع fconcat = concat) وقد ركضت 200 اختبارات كما كنت أتوقع، لذلك أنا mystified لماذا لا تفعل ذلك من أجلك. لكنك لا تحتاج إلى إضافة Arbitrary نموذج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top