Giả sử tôi có một loại kỷ lục:cách Idiomatic co lại mức kỷ lục trong QuickCheck
data Foo = Foo {x, y, z :: Integer}
Một cách gọn gàng viết một ví dụ Arbitrary sử dụng Control.Applicative như thế này:
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
Danh mục co lại cho một Foo là như vậy, sản phẩm Descartes của tất cả các co lại của các thành viên của nó.
Nhưng nếu một trong những thu nhỏ này trả về [] thì sẽ không có sự co lại cho toàn bộ Foo. Vì vậy, điều này không hoạt động.
tôi có thể cố gắng tiết kiệm nó bằng cách bao gồm các giá trị ban đầu trong danh sách co:
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
Nhưng bây giờ thu nhỏ (Foo 0 0 0) sẽ trở lại [Foo 0 0 0], có nghĩa là thu hẹp sẽ không bao giờ chấm dứt. Vì vậy, điều đó không hoạt động.
Có vẻ như có gì đó khác hơn < *> đang được sử dụng tại đây, nhưng tôi không thể nhìn thấy gì.
Tôi nghĩ câu trả lời đầu tiên của bạn sẽ giải quyết được vấn đề trước mắt, cảm ơn. Ngoài ra, một cái gì đó giống như thứ hai của bạn có thể làm với đang được thêm vào QuickCheck –