33 lines
849 B
Haskell
33 lines
849 B
Haskell
|
module Main where
|
||
|
|
||
|
import Data.List
|
||
|
import Test.QuickCheck
|
||
|
|
||
|
-- Sorting twice changes nothing
|
||
|
prop_idempotency :: Ord a => [a] -> Bool
|
||
|
prop_idempotency xs = qsort xs == qsort (qsort xs)
|
||
|
|
||
|
-- Sorting doesn't change the length
|
||
|
prop_len :: Ord a => [a] -> Bool
|
||
|
prop_len xs = length xs == length (qsort xs)
|
||
|
|
||
|
-- Sorted result is a permutation of input
|
||
|
prop_perm :: Ord a => [a] -> Bool
|
||
|
prop_perm xs = (qsort xs) `elem` (permutations xs)
|
||
|
|
||
|
-- Sorting produces sorted list
|
||
|
prop_sort :: Ord a => [a] -> Bool
|
||
|
prop_sort = isSorted . qsort
|
||
|
where
|
||
|
isSorted :: Ord a => [a] -> Bool
|
||
|
isSorted [] = True
|
||
|
isSorted [x] = True
|
||
|
isSorted (x:y:zs) = (x <= y) && isSorted (y:zs)
|
||
|
|
||
|
qsort :: Ord a => [a] -> [a]
|
||
|
qsort [] = []
|
||
|
qsort (p:xs) = (qsort lesser) ++ p:(qsort greater)
|
||
|
where
|
||
|
lesser = filter (< p) xs
|
||
|
greater = filter (>= p) xs
|