slides_2015/exampleCode/lecture8/sort.hs
2015-06-14 10:13:11 +02:00

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