मान लीजिए मैं एक रिकॉर्ड प्रकार है:मुहावरेदार रास्ता
data Foo = Foo {x, y, z :: Integer}
एक मनमाना उदाहरण लेखन की एक स्वच्छ रास्ता इस तरह Control.Applicative उपयोग करता है:
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
की सूची एक फू के लिए shrinks इस प्रकार अपने सदस्यों के सभी shrinks के कार्टशियन उत्पाद है।
लेकिन यदि इनमें से कोई भी कमी आती है [] तो फू के लिए पूरी तरह से कोई कमी नहीं होगी। तो यह काम नहीं करता है।
मैं छोटा सूची में मूल मूल्य शामिल करके यह बचत की कोशिश कर सकते:
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
लेकिन अब हटना (फू 0 0 0) वापस आ जाएगी [फू 0 0 0], जिसका अर्थ है कि सिकुड़ने कभी नहीं होगा समाप्त। तो यह या तो काम नहीं करता है।
ऐसा लगता है कि < *> के अलावा कुछ और होना चाहिए, लेकिन मैं नहीं देख सकता।
मुझे लगता है कि आपका पहला जवाब तत्काल समस्या हल करता है, धन्यवाद। इसके अलावा, आपके दूसरे की तरह कुछ क्विक चेक में जोड़ा जा सकता है –