import Test.QuickCheck import Data.List( sort, insert ) -- ordered :: Ord a => [a] -> Bool ordered (x:y:xs) = x <= y && ordered (y:xs) ordered _ = True -- try 1, does not work prop_Insert1 :: Int -> [Int] -> Bool prop_Insert1 x xs = ordered (insert x xs) -- try 2, works badly prop_Insert2 :: Int -> [Int] -> Property prop_Insert2 x xs = collect (length xs) $ ordered xs ==> ordered (insert x xs) -- try 3, works better orderedList :: Gen [Int] orderedList = do xs <- arbitrary return (sort xs) data OrderedList = Ordered [Int] deriving ( Show ) instance Arbitrary OrderedList where arbitrary = do xs <- orderedList return (Ordered xs) prop_Insert3 :: Int -> OrderedList -> Bool prop_Insert3 x (Ordered xs) = ordered (insert x xs)